在Plotly中点击数据点打开网址?
我已经成功地用Python创建了plotly图表,并且还为数据点制作了自定义的HTML提示框。但是,我还没找到办法让用户点击数据点时能打开一个链接。我希望能有一个新的标签页弹出来,显示与那个特定数据点相关的更多信息。
有没有人能想到用plotly实现这个功能的方法呢?
6 个回答
根据@JimInCanada提到的注释功能,我成功地为特定数据点嵌入了一个与上下文相关的链接。为了说明这个过程,我使用了Plotly Express库中的gapminder内置数据。
这些数据包括不同年份的各国人均GDP、预期寿命和人口。代码创建了一个散点图对象,更新了一些基本的布局信息,最重要的是,它遍历数据行,添加了一个注释字典,其中包含x和y坐标,以及一个关键字text
,这个关键字链接到特定数据点的URL。由于x轴是对数坐标,所以x值使用了math.log10(x)
。
以下是完整的代码:
import math
df = px.data.gapminder().query("year==2007 and continent=='Asia'")
fig = px.scatter(df, x="gdpPercap", y="lifeExp", color="lifeExp", \
size="pop", log_x=True, size_max=60)
fig.update_layout(
height=800,width=1200,
title_text='GDP and Life Expectancy (Asia, 2007)'
)
for idx in df.index:
url="<a href='https://en.wikipedia.org/wiki/Demographics_of_"+df['country'][idx]+"' target='_blank'>"+df['country'][idx]+"</a>"
fig.add_annotation(dict(x=math.log10(df['gdpPercap'][idx]),
y=df['lifeExp'][idx],
showarrow=False,
text=url,
xanchor='auto',
yanchor='auto'))
fig.show()
这是生成的图表,显示了指针和特定数据点的URL:
如果有人想了解更多细节,我在medium上写了这篇文章。
这里有一个解决方法,使用 FigureWidget
,具体可以参考 这个链接,对我来说是有效的。
如果你在使用Dash这个工具,你可以把网址存放在customdata
这个字段里,然后在一个处理clickData
输入的回调函数中把它取出来,方法如下。
import webbrowser
import dash
from dash.exceptions import PreventUpdate
import dash_core_components as dcc
from dash.dependencies import Input, Output
import plotly.express as px
import pandas as pd
app = dash.Dash(__name__)
df = pd.DataFrame(
dict(
x=[1, 2],
y=[2, 4],
urls=["https://www.google.com","https://plotly.com/dash/"],
)
)
app.layout = html.Div(
[
dcc.Graph(
id="graph-id",
figure=px.scatter(data_frame=df, x="x", y="y", custom_data=("urls",)),
),
]
)
@app.callback(
Output('graph-id', 'figure'),
[Input('graph-id', 'clickData')])
def open_url(clickData):
if clickData != None:
url = clickData['points'][0]['customdata'][0]
webbrowser.open_new_tab(url)
else:
raise PreventUpdate
这有点绕,但能实现想要的功能。
你可以在注释中放一些HTML内容。这包括像文本这样的超链接。
如果你想点击一个点而不是文本,可以创建一个空字符串的注释,内容是" ",并把它放在你的数据点正上方。
我通常使用Python的API来制作图表,所以注释的代码大概是这样的:
plotAnnotes = []
plotAnnotes.append(dict(x=xVal[i],
y=yVal[i],
text="""<a href="https://plot.ly/">{}</a>""".format("Text"),
showarrow=False,
xanchor='center',
yanchor='center',
))
然后在布局中包含annotations=plotAnnotes。xVal[i]和yVal[i]的值会来自你的数据。
现在还不太可能做到,但最好的办法可能是在文本中加入一个链接,当你把鼠标放上去的时候可以看到。这里有个例子:https://plot.ly/~chris/2540(点击“代码”标签可以看到怎么复制这个图表)