如何正确设置Plotly的updatemenus按钮中args与args2参数值?
一、参数规则说明
args与args2的核心逻辑
args:按钮首次点击时,传递给按钮method属性对应方法的参数args2:按钮第二次点击时,传递给对应方法的参数,用来实现切换效果,和args结构完全一致
对于你使用的method='restyle'(修改轨迹属性的方法),参数固定结构为:[<属性修改字典>, <可选:要作用的轨迹索引列表>]
- 属性修改字典:键是轨迹的属性名(如
visible、y、name),值是要设置的属性值;如果值是列表,列表长度必须和你指定的轨迹数量完全对应,实现逐轨迹赋值 - 轨迹索引列表:你创建轨迹的顺序就是索引顺序,从0开始计数,不填的话默认修改所有轨迹
二、测试代码无效果的原因
你将索引列表改为[2,3]时,只指定了2条目标轨迹,但属性字典里的y、name都传入了4个元素的列表,值的长度和目标轨迹数量不匹配,Plotly无法完成属性赋值,所以没有效果。
三、精准控制目标轨迹的正确方案
你原来的实现其实有冗余:已经预先创建了4条对应曲线的轨迹,不需要再动态修改y和name属性,直接控制visible属性即可,逻辑更清晰不易出错,示例代码如下:
# imports import plotly.graph_objects as go import numpy as np # data x = np.linspace(-np.pi, np.pi, 100) y1 = np.sin(x) y1b = y1-1 y2 = np.tan(x) y2b = y2-1 # plotly setup fig = go.Figure() # 预先添加4条轨迹,索引0:sin、1:sin-1、2:tan、3:tan-1 fig.add_traces(go.Scatter(x=x, y=y1,name='sin', visible=False, showlegend=True)) fig.add_traces(go.Scatter(x=x, y=y1b,name='sin - 1', visible=False, showlegend=True)) fig.add_traces(go.Scatter(x=x, y=y2,name='tan', visible=False, showlegend=True)) fig.add_traces(go.Scatter(x=x, y=y2b,name='tan - 1', visible=False, showlegend=True)) # 构造菜单,直接控制显隐 updatemenus = [ { 'active':-1, 'buttons': [ { 'method': 'restyle', 'label': 'Sine', # 首次点击:将索引0、1的轨迹设为可见,其他设为不可见 'args': [ {'visible': [True, True, False, False]} ], # 第二次点击:所有轨迹设为不可见 'args2': [ {'visible': [False, False, False, False]} ] }, { 'method': 'restyle', 'label': 'Tan', # 首次点击:将索引2、3的轨迹设为可见,其他设为不可见 'args': [ {'visible': [False, False, True, True]} ], # 第二次点击:所有轨迹设为不可见 'args2': [ {'visible': [False, False, False, False]} ] } ], 'direction': 'down', 'showactive': True, } ] # update layout with buttons, and show the figure fig.update_layout(updatemenus=updatemenus) fig.show()
如果要自定义修改指定轨迹的属性,只要保证属性值的长度和你指定的轨迹数量一致即可,比如要修改索引2、3两条轨迹的y值,写法如下:
'args': [ {'y': [y1, y1b], 'name':['sin', 'sin - 1'], 'visible': True}, [2, 3] ]
内容的提问来源于stack exchange,提问作者Downforu
相关产品推荐
相关产品推荐

