Plotly:如何使用 updatemenus 更新一个特定的跟踪?

ves*_*and 4 python plotly

这是 Plotly 的后续问题:Plotly:更新菜单的按钮如何真正工作?

考虑由下面的代码片段生成的下图:

阴谋:

在此输入图像描述

代码:

# 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']]}],
                    
                   label="df1",
                   method="restyle"
                ),
                dict(args=[{'y':[df2['A'], df2['B']]}],
                    
                    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()
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,我'y'使用按钮 和 更新值dict(args=[{'y':[df2['A'], df2['B']]}]。这将为图中指定的两条迹线分配新值,如下所示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'}]
Run Code Online (Sandbox Code Playgroud)

由于我已将列表分配[df2['A'], df2['B']]'y',因此plotly 知道我打算更新'y'上面代码片段中的两个实例。但是在按钮和更新菜单的上下文中,有没有一种方法可以指定 'y'更新的内容(换句话说:特定的跟踪或线路)。如果我只分配一个引用(在本例中为数组或 pandas 数据帧),则两条跟踪将显示相同的值。因此更改以下部分:

 args=[{'y':[df2['A'], df2['B']]}]
Run Code Online (Sandbox Code Playgroud)

...有了这个:

args=[{'y':[df2['A']]}]
Run Code Online (Sandbox Code Playgroud)

...单击后将生成以下图df2

在此输入图像描述

我真的很想保持所有未指定的'y'和痕迹不变。

感谢您的任何建议!

nic*_*ten 10

args在为每个传递的列表中button,您可以在字典后面添加一个整数来指示要更新的跟踪。例如,以下内容将仅更新第一个跟踪(即索引 = 0 处的跟踪)

buttons=list([dict(args=[{'y':[df1['A'],df1['B']]}, [0]], # note the `, [0]` here!

                   label="df1",
                   method="restyle"
                ),
                dict(args=[{'y':[df2['A'], df2['B']]}, [0], # note the `, [0]` here!

                    label="df2",
                    method="restyle"
                )
            ])
Run Code Online (Sandbox Code Playgroud)