基于两列的下拉菜单直方图 - 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 python。 updatmenus 不支持依赖下拉菜单。如果你想要他们使用 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()]),
)
]
}
]
)
我想根据第一个下拉菜单(年份)和第二个下拉菜单(公司)中的值的 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 python。 updatmenus 不支持依赖下拉菜单。如果你想要他们使用 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()]),
)
]
}
]
)