【问题标题】:Plotly: How to create a dropdown button that groups lines in a line graph?Plotly:如何创建一个下拉按钮来分组折线图中的线?
【发布时间】:2021-09-09 16:03:28
【问题描述】:

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

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)

【问题讨论】:

标签: python pandas plotly


【解决方案1】:

你所要做的就是:

1. 使用px.line(df, x=df.index, y = df.columns)为所有系列构建一个图

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

maps = {'group 1': ['GOOG', 'AAPL', 'AMZN', 'FB'],
           'group 2':['NFLX', 'MSFT']}

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

3. 设置一个列表,其中列出了哪些跟踪对于您图中的哪些组可见:

[[True, True, True, True, False, False],
 [False, False, False, False, True, True]]

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

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

button =  dict(label=g,
               method = 'restyle',
                args = ['visible',visList[i]])

下面的完整代码sn-p会产生下图:

情节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()

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2020-12-01
    • 1970-01-01
    • 2017-07-31
    • 2023-01-13
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多