Plotly中的双轴堆积条形图

Posted

技术标签:

【中文标题】Plotly中的双轴堆积条形图【英文标题】:Stacked bar chart with dual axis in Plotly 【发布时间】:2022-01-18 01:57:58 【问题描述】:

请考虑以下示例:

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

【问题讨论】:

【参考方案1】:

堆叠图已设置,但未启用,因此我将条形图模式更改为堆叠并隐藏图例。此外,我在 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()

【讨论】:

以上是关于Plotly中的双轴堆积条形图的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何使用 go.Bar 向堆积条形图添加数据标签?

Plotly:仅在特定子图中堆积条形图

Plotly:如何重命名 plotly express 堆积条形图的图例元素?

如何更改使用 Plotly Express 创建的堆积条形图的文本方向?

按小时重新采样 Pandas DataFrame 并使用 Plotly 绘制堆积条形图

绘制水平堆积条形图不适用于日期中的 x 轴