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

Matplotlib如何增大不等量分组柱状图的组间间距

解决方法

你的问题根源是直接使用原始数值作为x轴坐标叠加偏移,部分x值(如11、12)存在5个系列的柱子,总宽度0.25*5=1.25超过了两个相邻x值的间距1,自然会出现挤压重叠。
正确的实现逻辑是先把所有出现过的x轴取值整理成有序的唯一类别,给每个类别分配固定的整数位置,所有系列的柱子都在对应类别的整数位置上叠加偏移,最后替换x轴刻度为原始类别值,没有对应数据的系列自动留空,从根本上避免挤压。
修改后的可运行代码如下:

import matplotlib.pyplot as plt

bar_width = 0.15 # 5个系列总宽度为0.15*5=0.75,小于相邻类别间距1,不会重叠

# 统一整理所有系列的数据
data_list = [
    {"x": [8, 9, 10, 11, 12], "y": [10, 20, 40, 60, 80], "label": "a"},
    {"x": [1, 2, 8, 9, 10, 11, 12], "y": [5, 10, 15, 20, 40, 60, 80], "label": "b"},
    {"x": [4, 5, 11, 14], "y": [12, 23, 70, 94], "label": "c"},
    {"x": [10, 11, 14], "y": [60, 120, 193], "label": "d"},
    {"x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "y": [3, 5, 23, 14, 10, 20, 45, 40, 56, 60, 80, 99], "label": "e"}
]

# 提取所有唯一的x值,排序后分配固定位置
all_x = sorted({x for item in data_list for x in item["x"]})
x_pos_map = {val: idx for idx, val in enumerate(all_x)}
series_count = len(data_list)

# 逐个绘制每个系列的柱子
for series_idx, item in enumerate(data_list):
    x_pos = [x_pos_map[x] + bar_width * series_idx for x in item["x"]]
    plt.bar(x_pos, item["y"], width=bar_width, align='center', label=item["label"])

# 调整x轴刻度位置到每个类别所有柱子的中间
plt.xticks([idx + bar_width * (series_count - 1) / 2 for idx in range(len(all_x))], all_x)

plt.legend()
plt.show()

如果需要调整柱子宽度,只要保证bar_width * 系列总数小于1,就不会出现重叠问题。

内容的提问来源于stack exchange,提问作者I_Al-thamary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 05:15:06