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

如何缩小Plotly分组堆叠条形图组间间隙及优化图表?

解决方案:调整分组堆叠条形图间隙与优化可视化

一、减小分组条形间隙(原需求实现)

要让各组条形几乎无间距相邻,核心是调整条形宽度和组间间隙参数:

import numpy as np
import pandas as pd
import plotly.graph_objects as go

rand_list = np.random.rand(30) 

df = pd.DataFrame(
    dict(
        week=[1.2,1.2,1.3,1.3,1.6,1.6,1.7,1.7,4.4,4.4] * 3,
        layout=["abc","abc","def","def", "ghi", "ghi"] * 5,
        response=["0", "1"] * 15,
        cnt= list(rand_list),
    )
)

fig = go.Figure()
fig.update_layout(
    template="simple_white",
    xaxis=dict(title_text="x-label"),
    yaxis=dict(title_text="y-label", showticklabels=False),
    barmode="stack",
    bargap=0.01,  # 极小化组间间隙
)

colors = ["#2A66DE", "#FFC32B"]

for r, c in zip(df.response.unique(), colors):
    plot_df = df[df.response == r]
    fig.add_trace(
        go.Bar(
            x=[plot_df.week, plot_df.layout], 
            y=plot_df.cnt, 
            name=r, 
            marker_color=c, 
            width=0.9  # 增大条形宽度,填充分组空间
        ),
    )

fig.show()

修改说明:

  • width=0.9:让单个分组内的堆叠条形尽可能填满分组的横向空间
  • bargap=0.01:将不同分组之间的间隙设置为极小值,实现近乎无间距的效果

二、更优可视化方案(组内无间隙+颜色区分响应类型)

如果希望用颜色区分response类别而非依赖X轴标签,同时保证组内堆叠无间隙,可以合并分组维度并简化X轴:

import numpy as np
import pandas as pd
import plotly.graph_objects as go

rand_list = np.random.rand(30) 

df = pd.DataFrame(
    dict(
        week=[1.2,1.2,1.3,1.3,1.6,1.6,1.7,1.7,4.4,4.4] * 3,
        layout=["abc","abc","def","def", "ghi", "ghi"] * 5,
        response=["0", "1"] * 15,
        cnt= list(rand_list),
    )
)

# 合并week和layout为统一分组标签,简化X轴展示
df["group"] = df["week"].astype(str) + "-" + df["layout"]

fig = go.Figure()
fig.update_layout(
    template="simple_white",
    xaxis=dict(title_text="分组(周-布局)", tickangle=45),  # 旋转标签避免重叠
    yaxis=dict(title_text="y-label", showticklabels=False),
    barmode="stack",
    bargap=0.01,  # 分组间近乎无间隙
    legend_title="响应类型"  # 明确图例含义
)

colors = ["#2A66DE", "#FFC32B"]

for r, c in zip(df.response.unique(), colors):
    # 按合并后的分组聚合数据,确保每个分组的堆叠值正确
    plot_df = df[df.response == r].groupby("group")["cnt"].sum().reset_index()
    fig.add_trace(
        go.Bar(
            x=plot_df["group"], 
            y=plot_df["cnt"], 
            name=f"响应{r}", 
            marker_color=c, 
            width=0.9
        ),
    )

fig.show()

优化点说明:

  1. 合并分组维度:将week和layout合并为group列,让X轴标签更简洁,避免双层轴的混乱
  2. 颜色区分核心维度:用颜色对应response类别,通过图例展示映射关系,无需依赖X轴标签传递信息
  3. 组内无间隙:Plotly的stack模式默认组内堆叠条形无间隙,无需额外设置
  4. 可读性提升:旋转X轴标签避免重叠,添加图例标题明确含义

内容的提问来源于stack exchange,提问作者Soumya Ranjan Sahoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:27:49