大佬教程收集整理的这篇文章主要介绍了Plotly:如何使用类似于在图例中单击它们的按钮来切换轨迹? Plot 1 - 在发布时全部被选中情节 2 - C 和 D 关闭图 3 - 所有 off情节 4 - 所有 on完整代码:,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 python 并使用交互式绘图(无 Dash)创建独立的 HTML 文件。我已经能够构建一个带有按钮的情节图,这些按钮可以切换图中轨迹的可见性。但是,此功能也会从图例中删除痕迹。我想要的是能够保留图例的功能(单击单个跟踪以切换可见性),但也有一组按钮可以将该功能扩展到我定义的一组跟踪。
目标是能够将所有内容(或选择的组)切换为不可见,但根据需要将该组中的单个项目添加回可见。
下面是一个示例(使用来自vestland this answer 的修改代码)来展示我目前正在尝试的内容。
import numpy as np
import pandas as pd
import plotly.graph_objects as go
import datetiR_750_11845@e
# mimic OP's datasample
NPERIODS = 200
np.random.seed(123)
df = pd.DataFrame(np.random.randint(-10,12,size=(NPERIODS,4)),columns=List('ABCD'))
dateList = pd.date_range(datetiR_750_11845@e.datetiR_750_11845@e(2020,1,1).strftime('%Y-%m-%d'),periods=NPERIODS).toList()
df['dates'] = dateList
df = df.set_index(['dates'])
df.index = pd.to_datetiR_750_11845@e(df.indeX)
df.iloc[0] = 0
df = df.cumsum()
# set up multiple traces
traces = []
buttons = []
for col in df.columns:
traces.append(go.Scatter(x=df.index,y=df[col],visible=True,name=col)
)
buttons.append(Dict(method='update',label=col,args=[{'visible':[x == col for x in df.columns]}],args2=[{'visible':[x != col for x in df.columns]}]
)
)
# create the layout
layout = go.Layout(
updatemenus=[
Dict(
type='buttons',direction='right',x=0.7,y=1.3,showactive=True,buttons=buttons
)
],title=Dict(text='Toggle Traces',x=0.5),showlegend=True
)
fig = go.figure(data=traces,layout=layout)
# add dropdown menus to the figure
fig.show()
那个例子不像我想要的那样工作。下面是它最初的截图。
问题是,如果我使用其中一个按钮,它会隐藏所有其他痕迹,但也会将它们从图例中删除,因此它们无法切换回可见状态。
所以我的问题变成了,在 args 列表/字典中是否有一个不同的值可以让功能与简单地点击图例中的轨迹相匹配?
有点相关,有没有办法获得每个跟踪的当前可见状态?
为了能够在不影响其他跟踪的情况下打开和关闭任何跟踪,似乎您必须为每个按钮包含一个更新菜单。可能还有其他方法可以做到这一点,但下面的代码片段将生成以下图:
C
和 D
关闭@H_673_54@
off
on
import numpy as np
import pandas as pd
import plotly.graph_objects as go
import datetiR_750_11845@e
import plotly.express as px
periods = 200
cols = list('ABCD')
np.random.seed(123)
df = pd.DataFrame(np.random.randint(-10,12,size=(periods,len(cols))),columns=cols)
datelist = pd.date_range(datetiR_750_11845@e.datetiR_750_11845@e(2020,1,1).strftime('%Y-%m-%d'),periods=periods).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
df.index = pd.to_datetiR_750_11845@e(df.indeX)
df.iloc[0] = 0
df = df.cumsum()
# # plotly
fig = go.Figure()
colors = px.colors.qualitative.Plotly
# set up multiple traces
for col in df.columns:
fig.add_trace(go.Scatter(x=df.index,y=df[col],name = col,visible=True
)
)
um = [ {} for _ in range(len(df.columns)) ]
buttons = []
menuadjustment = 0.15
buttonX = -0.1
buttonY = 1 + menuadjustment
for i,col in enumerate(df.columns):
button = Dict(method='restyle',label=col,visible=True,args=[{'visible':True,'line.color' : colors[i]},[i]],args2 = [{'visible': false,)
# adjust some button features
buttonY = buttonY-menuadjustment
um[i]['buttons'] = [button]
um[i]['showactive'] = false
um[i]['y'] = buttonY
um[i]['x'] = buttonX
# add a button to toggle all traces on and off
button2 = Dict(method='restyle',label='All',args=[{'visible':TruE}],args2 = [{'visible': falsE}],)
# assign button2 to an updatemenu and make some adjustments
um.append(Dict())
um[i+1]['buttons'] = [button2]
um[i+1]['showactive'] = True
um[i+1]['y']=buttonY - menuadjustment
um[i+1]['x'] = buttonX
# add dropdown menus to the figure
fig.update_layout(showlegend=True,updatemenus=um)
# adjust button type
for m in fig.layout.updatemenus:
m['type'] = 'buttons'
f = fig.full_figure_for_development(warn=falsE)
fig.show()
,
经过适当的搜索后,多亏了 Plotly 论坛上的 this answer,我才能弄清楚。我还没有找到列出所有这些选项的地方,但这会很有帮助。
似乎在 args 字典中给 'visible' 的列表不需要只是布尔值。为了使项目在图例中可见但隐藏在图中,您需要将值设置为“legendonly”。然后仍然可以单击图例条目以切换个人可见性。这回答了我问题的主旨。
args = [{'visible': TruE}]
args = [{'visible': 'legendonly'}]
args = [{'visible': falsE}]
Vestland 的回答帮助解决了我问题的第二部分,只修改了我想要的痕迹,其他一切保持不变。事实证明,您可以将字典后的索引列表传递给 args,这些 args 将仅适用于提供的索引处的跟踪。我在示例中使用列表理解来查找与给定名称匹配的跟踪。我还为每一列添加了另一条跟踪,以显示这对多条跟踪是如何工作的。
args = [{'key':arg},[list of trace inDices to apply key:arg to]]
下面是现在工作的代码。
import numpy as np
import pandas as pd
import plotly.graph_objects as go
import datetiR_750_11845@e
# mimic OP's datasample
NPERIODS = 200
np.random.seed(123)
df = pd.DataFrame(np.random.randint(-10,size=(NPERIODS,4)),columns=list('ABCD'))
datelist = pd.date_range(datetiR_750_11845@e.datetiR_750_11845@e(2020,periods=NPERIODS).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
df.index = pd.to_datetiR_750_11845@e(df.indeX)
df.iloc[0] = 0
df = df.cumsum()
# set up multiple traces
traces = []
buttons = []
for col in df.columns:
traces.append(go.Scatter(x=df.index,name=col)
)
traces.append(go.Scatter(x=df.index,y=df[col]+20,name=col)
)
buttons.append(Dict(method='restyle',args=[{'visible':TruE},[i for i,x in enumerate(traces) if x.name == col]],args2=[{'visible':'legendonly'},x in enumerate(traces) if x.name == col]]
)
)
allButton = [
Dict(
method='restyle',args2=[{'visible':'legendonly'}]
)
]
# create the layout
layout = go.Layout(
updatemenus=[
Dict(
type='buttons',direction='right',x=0.7,y=1.3,showactive=True,buttons=allButton + buttons
)
],title=Dict(text='Toggle Traces',x=0.5),showlegend=True
)
fig = go.Figure(data=traces,layout=layout)
# add dropdown menus to the figure
fig.show()
这提供了以下功能:
“全部”按钮可以切换所有轨迹的可见性。
每个其他按钮只会切换具有匹配名称的跟踪。这些痕迹仍将在图例中可见,并且可以通过在图例中单击它们或再次单击按钮来恢复可见。
点击“B”按钮后(两次点击 arg2)。
然后在单击图例中的第一个 B 迹线之后。
以上是大佬教程为你收集整理的Plotly:如何使用类似于在图例中单击它们的按钮来切换轨迹? Plot 1 - 在发布时全部被选中情节 2 - C 和 D 关闭图 3 - 所有 off情节 4 - 所有 on完整代码:全部内容,希望文章能够帮你解决Plotly:如何使用类似于在图例中单击它们的按钮来切换轨迹? Plot 1 - 在发布时全部被选中情节 2 - C 和 D 关闭图 3 - 所有 off情节 4 - 所有 on完整代码:所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。