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
相关产品推荐
相关产品推荐

