You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly技术问题:单迹线生成堆叠条形图及单列数据双堆叠图并排实现

嘿,这两个Plotly相关的需求都能轻松搞定!结合你提供的数据框,我一步步给你拆解解决方案:

首先,数据预处理

先把原始的长格式数据转换成适合做堆叠图的汇总格式,用pandas的交叉表就能快速实现:

import pandas as pd

# 构建你的数据框
data = {
    'Field': ['Police', 'Research', 'Police', 'Banking', 'Healthcare', 'Research', 'Healthcare', 'Banking'],
    'Issue': ['Budget cuts', 'Budget cuts', 'Time consuming', 'Lack of support', 'Lack of support', 'Bureaucracy', 'Bureaucracy', 'Budget cuts']
}
df = pd.DataFrame(data)

# 生成Field和Issue的交叉计数表(用于第一个堆叠图)
cross_df = pd.crosstab(df['Field'], df['Issue'])
# 生成Issue和Field的交叉计数表(用于第二个堆叠图)
cross_df_rev = pd.crosstab(df['Issue'], df['Field'])

问题1:用单迹线生成堆叠条形图

Plotly默认的堆叠条形图会为每个堆叠层生成单独的迹线,但如果要用单个迹线实现堆叠效果,可以借助plotly.graph_objects的Bar组件,把各堆叠层的数值以二维数组形式传入y参数,再开启堆叠模式:

import plotly.graph_objects as go

# 单迹线堆叠条形图
fig_single = go.Figure(data=[
    go.Bar(
        x=cross_df.index,  # x轴为Field类别
        y=[cross_df[col].tolist() for col in cross_df.columns],  # 二维数组,每个子数组对应一类Issue的计数
        name='Issue Distribution',
        marker_color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'],  # 给每个堆叠层分配专属颜色
        text=[cross_df[col].tolist() for col in cross_df.columns],  # 显示每个堆叠块的数值标签
        textposition='auto'
    )
])

fig_single.update_layout(
    title='单迹线堆叠条形图(Field vs Issue)',
    xaxis_title='Field',
    yaxis_title='Count',
    barmode='stack'  # 关键:开启堆叠模式
)

fig_single.show()

这样就用单个迹线实现了堆叠效果,每个Field对应的不同Issue数量会自动堆叠在一起。


问题2:两个堆叠条形图并排展示

当然可以实现!我们用plotly.subplots创建并排的子图布局,每个子图对应一个基于单列分组的堆叠条形图:

from plotly.subplots import make_subplots

# 创建1行2列的子图布局
fig = make_subplots(
    rows=1, cols=2,
    subplot_titles=('基于Field的堆叠条形图', '基于Issue的堆叠条形图'),
    horizontal_spacing=0.2  # 调整子图间的间距,避免拥挤
)

# 第一个子图:以Field为x轴,Issue作为堆叠维度
for col in cross_df.columns:
    fig.add_trace(
        go.Bar(x=cross_df.index, y=cross_df[col], name=col),
        row=1, col=1
    )

# 第二个子图:以Issue为x轴,Field作为堆叠维度
for col in cross_df_rev.columns:
    fig.add_trace(
        go.Bar(x=cross_df_rev.index, y=cross_df_rev[col], name=col),
        row=1, col=2
    )

# 统一设置全局样式
fig.update_layout(
    title='两个堆叠条形图并排展示',
    barmode='stack',
    height=500,
    width=1000
)

# 给每个子图设置轴标题
fig.update_xaxes(title_text='Field', row=1, col=1)
fig.update_xaxes(title_text='Issue', row=1, col=2)
fig.update_yaxes(title_text='Count', row=1, col=1)
fig.update_yaxes(title_text='Count', row=1, col=2)

fig.show()

这里两个子图分别对应基于Field列和Issue列的分组堆叠,完美实现了并排展示的需求。

如果你更习惯用plotly.express,也可以用px.bar(df, x='Field', color='Issue', barmode='stack')快速生成堆叠图,只是底层会自动生成多迹线,视觉效果和单迹线实现的是一致的~

内容的提问来源于stack exchange,提问作者user8322222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:34:59