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

柱状图布局调整求助:消除指定ID柱间距并居中指定ID柱子

柱状图布局调整求助:消除指定ID柱间距并居中指定ID柱子

嘿Julia,我来帮你搞定这个Plotly柱状图的布局问题!你遇到的两个需求——消除262274的双柱间隙、让262277的单柱居中,其实可以通过手动控制柱子的位置和宽度来实现,之前的全局参数(bargap/bargroupgap)会影响所有柱子,所以我们需要针对性调整单个trace的属性。

先分析下你的问题:你现在是按Test_Number逐个添加柱状图trace,每个trace对应不同的id。对于有多个测试的id(比如262274),Plotly默认的分组模式会给柱子之间留间隙;而单个测试的id(比如262277),默认会靠左显示,不会对齐刻度中心。

下面是修改后的代码,我会一步步解释逻辑:

import plotly.graph_objects as go
import pandas as pd

# 先预处理数据:统计每个id对应的测试数量
id_test_counts = df.groupby('id')['Test_Number'].nunique().to_dict()

o = go.Figure()
color = ["indigo", "green", "turquoise", "blue", "orange"]

for i in range(1, 6):
    subset = df[df["Test_Number"] == i]
    # 为每个id计算柱子的偏移位置
    adjusted_x = []
    for idx in subset['id']:
        num_tests = id_test_counts[idx]
        if num_tests == 1:
            # 单柱子直接放在id刻度位置,实现居中
            adjusted_x.append(idx)
        else:
            # 多柱子计算偏移:让它们紧密排列无间隙
            # 先确定当前测试在该id的测试序列中的位置
            test_list = sorted(df[df['id'] == idx]['Test_Number'].unique())
            pos = test_list.index(i)
            # 计算偏移量,确保柱子之间无缝衔接
            offset = (pos - (num_tests - 1)/2) * (0.8 / num_tests)
            adjusted_x.append(idx + offset)
    
    o.add_trace(go.Bar(
        x=adjusted_x,
        y=subset["count"],
        marker_color=color[i - 1],
        name="Test Number " + str(i),
        # 统一柱子宽度,保证多柱组总宽度和单柱一致
        width=0.8 / max(id_test_counts.values())
    ))

# 调整x轴,确保显示的是原始id刻度,而非偏移后的数值
o.update_layout(
    title="Id vs Count",
    xaxis_title="id",
    yaxis_title="Count",
    yaxis=dict(
        tickmode='linear',
        tick0=1,
        dtick=1,
    ),
    xaxis=dict(
        tickvals=list(id_test_counts.keys()),
        ticktext=list(id_test_counts.keys())
    ),
    # 使用overlay模式,让我们手动设置的位置完全生效
    barmode='overlay'
)

o.show()

关键调整点说明:

  1. 统计每个id的测试数量:通过groupby先搞清楚哪些id是单柱、哪些是多柱,为后续位置计算做准备。
  2. 手动计算柱子偏移:
    • 单柱id(如262277):直接把x值设为原始id,让柱子刚好对齐刻度中心。
    • 多柱id(如262274):根据测试的顺序计算偏移量,让多个柱子紧密排列,完全消除间隙。
  3. 统一柱子宽度:保证多柱组的总宽度和单柱一致,视觉上更协调。
  4. 切换到overlay模式:关闭Plotly默认的分组间距逻辑,让我们手动设置的位置和宽度完全生效,同时通过xaxis.tickvals确保x轴显示的是原始id数值。

另外,你之前提到设置markercolor="Test_Number"导致堆叠图,那是因为默认的barmode是stack,如果用Plotly Express的话,只需要加上barmode='group'就能得到分组图,但你现在用的是go.Bar逐个添加trace,所以上面的方案更适配你的代码结构。

备注:内容来源于stack exchange,提问作者Julia Hall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:52:43