Plotly 中双轴堆积条形图
Stacked bar chart with dual axis in Plotly
请考虑以下示例:
import pandas as pd
mydata = pd.DataFrame({'time': [pd.to_datetime('2021-01-02'),
pd.to_datetime('2021-01-02'),
pd.to_datetime('2021-01-03'),
pd.to_datetime('2021-01-03')],
'group': ['a','b','a','b'],
'value': [1,3,3,5]})
myline = pd.DataFrame({'time': [pd.to_datetime('2021-01-02'),
pd.to_datetime('2021-01-03')],
'value':[39,46]})
mydata
Out[222]:
time group value
0 2021-01-02 a 1
1 2021-01-02 b 3
2 2021-01-03 a 3
3 2021-01-03 b 5
我正在尝试创建一个双轴图表,在一个轴上使用 myline
中的线,在另一个轴上使用 mydata
中的堆叠条形图。
我下面的代码几乎可以做到这一点,但有几个问题:
- 条形图没有堆叠!
- 因为我的数据有许多不同的类别,所以我需要使用具有许多不同颜色的
colorscale
,例如 dark24
(https://plotly.com/python/discrete-color/)。我如何指定条形图的填充颜色?
非常感谢任何建议。
谢谢!
import plotly.graph_objects as go
from plotly.subplots import make_subplots
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
go.Scatter(x=myline['time'],
y=myline["value"],
name="Column1",
mode="lines"),
secondary_y=True
)
layout = go.Layout(barmode='stack')
for t in mydata['group'].unique():
dfp = mydata.loc[mydata['group']==t]
fig.add_trace(go.Bar(x=dfp['time'],
y = dfp['value'],
name=t,
text = t),
secondary_y=False)
fig.update_xaxes(title_text="Letter")
# Set y-axes titles
fig.update_yaxes(title_text="Column2", secondary_y=False)
fig.update_yaxes(title_text="Column1", secondary_y=True)
fig.update(layout_showlegend=False)
fig.show()
设置了堆叠图,但没有启用,所以我将条形图模式更改为堆叠并隐藏图例。另外,我在 graph_objects 中找不到颜色图设置,所以我用所需的颜色图更新了默认颜色图。我用三个对象检查了测试数据,它们用新的颜色图更新了。但是,我没有去检查 24 种颜色,所以你必须自己检查。
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.express as px
colors = px.colors.qualitative.Dark24
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
go.Scatter(x=myline['time'],
y=myline["value"],
name="Column1",
mode="lines"),
secondary_y=True
)
#layout = go.Layout(barmode='stack')
for t in mydata['group'].unique():
dfp = mydata.loc[mydata['group']==t]
fig.add_trace(go.Bar(x=dfp['time'],
y = dfp['value'],
name=t,
text = t),
secondary_y=False)
fig.update_xaxes(title_text="Letter")
# Set y-axes titles
fig.update_yaxes(title_text="Column2", secondary_y=False)
fig.update_yaxes(title_text="Column1", secondary_y=True)
fig.update_layout(showlegend=False, barmode='stack')
fig.layout.colorway = colors
fig.show()
请考虑以下示例:
import pandas as pd
mydata = pd.DataFrame({'time': [pd.to_datetime('2021-01-02'),
pd.to_datetime('2021-01-02'),
pd.to_datetime('2021-01-03'),
pd.to_datetime('2021-01-03')],
'group': ['a','b','a','b'],
'value': [1,3,3,5]})
myline = pd.DataFrame({'time': [pd.to_datetime('2021-01-02'),
pd.to_datetime('2021-01-03')],
'value':[39,46]})
mydata
Out[222]:
time group value
0 2021-01-02 a 1
1 2021-01-02 b 3
2 2021-01-03 a 3
3 2021-01-03 b 5
我正在尝试创建一个双轴图表,在一个轴上使用 myline
中的线,在另一个轴上使用 mydata
中的堆叠条形图。
我下面的代码几乎可以做到这一点,但有几个问题:
- 条形图没有堆叠!
- 因为我的数据有许多不同的类别,所以我需要使用具有许多不同颜色的
colorscale
,例如dark24
(https://plotly.com/python/discrete-color/)。我如何指定条形图的填充颜色?
非常感谢任何建议。 谢谢!
import plotly.graph_objects as go
from plotly.subplots import make_subplots
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
go.Scatter(x=myline['time'],
y=myline["value"],
name="Column1",
mode="lines"),
secondary_y=True
)
layout = go.Layout(barmode='stack')
for t in mydata['group'].unique():
dfp = mydata.loc[mydata['group']==t]
fig.add_trace(go.Bar(x=dfp['time'],
y = dfp['value'],
name=t,
text = t),
secondary_y=False)
fig.update_xaxes(title_text="Letter")
# Set y-axes titles
fig.update_yaxes(title_text="Column2", secondary_y=False)
fig.update_yaxes(title_text="Column1", secondary_y=True)
fig.update(layout_showlegend=False)
fig.show()
设置了堆叠图,但没有启用,所以我将条形图模式更改为堆叠并隐藏图例。另外,我在 graph_objects 中找不到颜色图设置,所以我用所需的颜色图更新了默认颜色图。我用三个对象检查了测试数据,它们用新的颜色图更新了。但是,我没有去检查 24 种颜色,所以你必须自己检查。
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.express as px
colors = px.colors.qualitative.Dark24
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
go.Scatter(x=myline['time'],
y=myline["value"],
name="Column1",
mode="lines"),
secondary_y=True
)
#layout = go.Layout(barmode='stack')
for t in mydata['group'].unique():
dfp = mydata.loc[mydata['group']==t]
fig.add_trace(go.Bar(x=dfp['time'],
y = dfp['value'],
name=t,
text = t),
secondary_y=False)
fig.update_xaxes(title_text="Letter")
# Set y-axes titles
fig.update_yaxes(title_text="Column2", secondary_y=False)
fig.update_yaxes(title_text="Column1", secondary_y=True)
fig.update_layout(showlegend=False, barmode='stack')
fig.layout.colorway = colors
fig.show()