Plotly:如何创建一个下拉按钮来对折线图中的线条进行分组?

Ben*_*del 3 python pandas plotly

我制作了一个折线图,其中的线条太多而无法整齐显示,我需要能够选择一个分组变量(省)并让它只显示该省中的线条(我在数据中有一个省列,说明哪个省它属于)。例如,我会在下拉列表中单击“安大略省”,然后只会显示与多伦多和渥太华等相对应的行。我究竟做错了什么?

在此输入图像描述

import plotly.express as px
import plotly.offline as pyo
import pandas as pd
import plotly.graph_objects as go

df = pd.read_csv('....csv')


fig_opend = px.line(data_frame = df, x='Round', y='Excess Demand For Plot', title= 'Canada', color='Product' ,
                    hover_name='Service Area Name', hover_data=['Product Number', 'Excess Demand', '(Initial) Supply', 'Aggregate Demand', 'Round'])



fig_opend.update_yaxes(title = 'Excess Demand')


fig_opend.update_layout(margin={"r":20,"t":27,"l":10,"b":10}, xaxis={'tickformat':',d'})


updatemenus = [dict(buttons_open=list([dict(method='update', args=[{'y':[df.loc[df_opend['Areas'] == 'West']]}],),]),direction="down",showactive=True)]

fig_opend.update_layout(updatemenus=updatemenus)
Run Code Online (Sandbox Code Playgroud)

ves*_*and 6

您所要做的就是:

1.为所有系列构建一个人物模型px.line(df, x=df.index, y = df.columns)

2.使用以下方法将您的线条/痕迹/系列映射到组:

maps = {'group 1': ['GOOG', 'AAPL', 'AMZN', 'FB'],
           'group 2':['NFLX', 'MSFT']}
Run Code Online (Sandbox Code Playgroud)

(我正在使用px.data.stocks()数据集,因为你没有提供数据集)

3.设置一个列表列表,其中的迹线对于图中的哪些组可见:

[[True, True, True, True, False, False],
 [False, False, False, False, True, True]]
Run Code Online (Sandbox Code Playgroud)

(不用担心,这将通过嵌套动态处理For Loop)。

4.使用这些列表通过按下以下位置的按钮来触发可见性:

button =  dict(label=g,
               method = 'restyle',
                args = ['visible',visList[i]])
Run Code Online (Sandbox Code Playgroud)

下面的完整代码片段将产生下图:

地块 1:

在此输入图像描述

例如,如果您选择,Group 2您将得到:

情节2:

在此输入图像描述

试一试,看看这是否是您想要的!

# imports
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go

# data
df = px.data.stocks().set_index('date')
maps = {'group 1': ['GOOG', 'AAPL', 'AMZN', 'FB'],
           'group 2':['NFLX', 'MSFT']}

# plotly figure
fig = px.line(df, x=df.index, y = df.columns) 

# groups and trace visibilities
group = []
vis = []
visList = []
for m in maps.keys():
    for col in df.columns:
        if col in maps[m]:
            vis.append(True)
        else:
            vis.append(False)
    group.append(m)
    visList.append(vis)
    vis = []

# buttons for each group
buttons = []
for i, g in enumerate(group):
    button =  dict(label=g,
                   method = 'restyle',
                    args = ['visible',visList[i]])
    buttons.append(button)

buttons = [{'label': 'all',
                 'method': 'restyle',
                 'args': ['visible', [True, True, True, True, True, True]]}] + buttons

                     

# update layout with buttons                       
fig.update_layout(
    updatemenus=[
        dict(
        type="dropdown",
        direction="down",
        buttons = buttons)
    ],
)
# buttons
fig.show()
Run Code Online (Sandbox Code Playgroud)