Plotly:更新菜单的按钮实际上是如何工作的?

2023-12-02

我为什么想知道?

这似乎是一个非常简单的问题,但我在使用下拉菜单编辑具有多个轨迹的图形时遇到了一些困难,所以我真的很渴望确保我理解plotlys下拉菜单、更新菜单和按钮的内部工作原理100%正确。因此,如果有人能抽出时间来看看下面的示例,那就太好了。


问题是什么?

考虑由下面的代码片段生成的以下简单绘图:

Plot1 :

enter image description here

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:

enter image description here

图 3 - 下拉菜单 =df2

enter image description here

代码 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),

这让我有点困惑,因为我们能够改变bothy仅引用它once在下拉菜单中插入按钮:

# from the snippet Code 2 above:
dict(args=[{'y':[df2['A'], df2['B']]}]

最后,主要问题是:

现在看来很明显,它的工作方式是 updatemenu 的值y从按钮,查找每个“y”键并在列表中插入元素[df2['A'], df2['B']]只要有就一一ys 来填充。但这真的是这里发生的事情吗?如果你们中的任何人能够提供自信的'YES'我对此感到非常高兴,但我真的希望有一个自信的人'NO'以及关于这些东西如何真正组合在一起的一些细节。


好问题!事情怎么样really工作是与method您指定要应用的底层plotly.js Javascript函数的名称的属性,其参数来自args。所以你实际上是在调用 JS 函数Plotly.restyle(<fig>, {'y': <whatever>})。这意味着您正在寻找的文档就在这里:https://plot.ly/javascript/plotlyjs-function-reference/更具体地说restyle函数在这里https://plot.ly/javascript/plotlyjs-function-reference/#plotlyrestyle

正如你所看到的,它说:

请注意,未指定跟踪索引假设您要重新设计样式all的痕迹。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Plotly:更新菜单的按钮实际上是如何工作的? 的相关文章

随机推荐