基于两列的下拉菜单直方图 - Plotly

Dropdown Menu Histogram based on two columns - Plotly

我想根据第一个下拉菜单(年份)和第二个下拉菜单(公司)中的值的 selection 绘制此图。我得到的是它没有考虑 selected 年份,只考虑公司价值 select 或左右(没有公司价值的年份)
我尝试了此处提出的解决方案和其他解决方案,但没有成功。 Dropdown bar chart (plotly) based on values column

数据框:

date    company_name    field   count
0   2015    CM          EM      3
1   2015    P&G         EP      1
2   2017    CM          MS      2
3   2017    P&G         EM      5
4   2017    POSCO       MS      8
5   2020    CM          EM      6
6   2020    POSCO       MS      6
7   2020    POSCO       EP      5

这里是我写的代码:

df = data.groupby(["date","company_name","field"])['product'].size().to_frame(name = 'count').reset_index()

fig = go.Figure()
fig.add_trace(go.Histogram(x=df.field,
                         y=df.count,
                         #colorscale=df.date,
                         visible=True)
             )

updatemenu = []
buttons = []
buttons1 = []

for col,col1 in zip(list(df.date.unique()),list(df.company_name.unique())):
    buttons.append(dict(method='restyle',
                        label=col,
                        visible=True,
                            args=[{'y':[df[(df.date==col)]["count"]],
                                   'x':[df[(df.date==col)].field],
                               'type':'histogram'}
                             
                             ],
                        )
                  )
    buttons1.append(dict(method='restyle',
                        label=col1,
                        visible=True,
                            args=[{'y':[df[(df.company_name==col1)]["count"]],
                                   'x':[df[(df.company_name==col1)].field],
                               'type':'histogram'}
                             
                             ],
                        )
                  )

updatemenu = []
your_menu = dict()
updatemenu.append(your_menu)
updatemenu.append(dict())
updatemenu[0]['buttons'] = buttons
updatemenu[0]['direction'] = 'down'
updatemenu[0]['showactive'] = True
updatemenu[0]['x'] = 0.1
updatemenu[1]['buttons'] = buttons1
updatemenu[1]['direction'] = 'down'
updatemenu[1]['showactive'] = True
updatemenu[1]['x'] = 0.5

fig.update_layout(showlegend=False, updatemenus=updatemenu)
fig.show()

结果:

我得到了 POSCO 产品的计数,但不是 2020 年的所有年份。如果我 select 2020,它会显示所有公司的计数产品。

PS:在这种情况下,有没有一种方法可以像 Plotly Express 颜色属性中那样基于列对直方图进行着色?

提前致谢!

  • 根据这个答案 Plotly express multiple dropdown menus in pythonupdatmenus 不支持依赖下拉菜单。如果你想要他们使用 dash
  • 下面显示了如何构建一个下拉菜单,其中两个选择都编码在一个下拉菜单中
import pandas as pd
import numpy as np
import io
import plotly.graph_objects as go
import plotly.express as px
import itertools

df = pd.read_csv(
    io.StringIO(
        """date    company_name    field   count
0   2015    CM          EM      3
1   2015    P&G         EP      1
2   2017    CM          MS      2
3   2017    P&G         EM      5
4   2017    POSCO       MS      8
5   2020    CM          EM      6
6   2020    POSCO       MS      6
7   2020    POSCO       EP      5"""
    ),
    sep="\s+",
)

cfg = [("x", "field"), ("y", "count")]

fig = px.histogram(df, **{ax: col for ax, col in cfg})

fig.update_layout(
    updatemenus=[
        {
            "buttons": [
                {
                    "label": f"{y if y>0 else ''} - {cn}",
                    "method": "restyle",
                    "args": [
                        {
                            ax: [
                                df.loc[
                                    (df["date"].eq(y) | (y == 0))
                                    & (df["company_name"].eq(cn) | (cn == "")),
                                    col,
                                ]
                            ]
                            for ax, col in cfg
                        }
                    ],
                }
                for y, cn in itertools.product(
                    np.concatenate([[0], df["date"].unique()]),
                    np.concatenate([[""], df["company_name"].unique()]),
                )
            ]
        }
    ]
)