我为什么想知道?
这似乎是一个非常简单的问题,但我在使用下拉菜单编辑具有多个轨迹的图形时遇到了一些困难,所以我真的很渴望确保我理解plotlys下拉菜单、更新菜单和按钮的内部工作原理100%正确。因此,如果有人能抽出时间来看看下面的示例,那就太好了。
问题是什么?
考虑由下面的代码片段生成的以下简单绘图:
Plot1 :
Code 1:
# imports
import plotly.graph_objs as go
import pandas as pd
import numpy as np
# data
df1 = pd.DataFrame({'index': ['1','2','3'], 'A': [10,10,12], 'B': [11,11,11]})
df2 = pd.DataFrame({'index': ['1','2','3'], 'A': [10,10,10], 'B': [11,11,12]})
# plotly figure setup
fig=go.Figure()
fig.add_trace(go.Scatter(x=df1['index'], y=df1['A'], mode='lines'))
fig.add_trace(go.Scatter(x=df1['index'], y=df1['B'], mode='lines'))
#f=fig.to_dict()
fig.show()
现在我想替换蓝线的数据df1['A']=[10,10,12]
with df2['A']=[10,10,10]
,同时替换红线的数据df1['B']=[11,11,11]
with df1['B']=[11,11,11]
.
我可以通过引入如下下拉菜单轻松地做到这一点:
图 2 - 下拉菜单 =df1
:
图 3 - 下拉菜单 =df2
代码 2 - 与代码 1 相同,但添加了菜单:
# imports
import plotly.graph_objs as go
import pandas as pd
import numpy as np
# data
df1 = pd.DataFrame({'index': ['1','2','3'], 'A': [10,10,12], 'B': [11,11,11]})
df2 = pd.DataFrame({'index': ['1','2','3'], 'A': [10,10,10], 'B': [11,11,12]})
# plotly figure setup
fig=go.Figure()
fig.add_trace(go.Scatter(x=df1['index'], y=df1['A'], mode='lines'))
fig.add_trace(go.Scatter(x=df1['index'], y=df1['B'], mode='lines'))
f=fig.to_dict()
#fig.show()
buttons=list([dict(args=[{'y':[df1['A'],df1['B']],
#'type':'scatter',
}],
label="df1",
method="restyle"
),
dict(args=[{'y':[df2['A'], df2['B']],
#'type':'scatter',
#'mode':'markers'
}],
label="df2",
method="restyle"
)
])
fig.update_layout(
updatemenus=[
go.layout.Updatemenu(
buttons=buttons,
direction="down",
pad={"r": 10, "t": 10},
showactive=True,
x=-0.25,
xanchor="left",
y=1,
yanchor="top"
),
]
)
fig.show()
它是如何工作的?
现在让我们看一下在引入下拉菜单之前该图的结构如何。我们可以通过查看变量来做到这一点f=fig.to_dict()
。以下是该词典的顶行:
{'data': [{'mode': 'lines',
'x': array(['1', '2', '3'], dtype=object),
'y': array([10, 10, 12], dtype=int64),
'type': 'scatter'},
{'mode': 'lines',
'x': array(['1', '2', '3'], dtype=object),
'y': array([11, 11, 11], dtype=int64),
'type': 'scatter'}]
在这里你可以看到'y'
出现两次:
# 1
'y': array([10, 10, 12], dtype=int64),
# 2
'y': array([10, 10, 12], dtype=int64),
这让我有点困惑,因为我们能够改变both值y
仅引用它once在下拉菜单中插入按钮:
# from the snippet Code 2 above:
dict(args=[{'y':[df2['A'], df2['B']]}]
最后,主要问题是:
现在看来很明显,它的工作方式是 updatemenu 的值y
从按钮,查找每个“y”键并在列表中插入元素[df2['A'], df2['B']]
只要有就一一y
s 来填充。但这真的是这里发生的事情吗?如果你们中的任何人能够提供自信的'YES'我对此感到非常高兴,但我真的希望有一个自信的人'NO'以及关于这些东西如何真正组合在一起的一些细节。