matplotlib绘制分组柱状图时如何调整各组之间的间隔距离
问题原因
你当前代码里手动设置的柱子偏移没有给指标组之间预留足够空白:5根柱子单根宽0.15,偏移从-0.2到+0.6总跨度达0.8,相邻两组的柱子首尾间距仅0.05,几乎贴在一起,加上整组柱子没有和x轴刻度居中对齐,很容易出现不同组柱体混杂的问题。
调整方案
不要手动硬编码柱子偏移量,通过「固定组间空白→自动计算柱宽→自动生成偏移量」的逻辑实现,后续调整空隙大小也更方便:
- 先定义组间要留的空白宽度,自动计算适配的单根柱子宽度
- 计算每个系列柱子的偏移量,让每个指标对应的整组柱子居中对齐到该指标的x刻度位置
- 保留x轴刻度和组中心对齐即可
调整后的可运行代码:
import numpy as np import matplotlib.pyplot as plt metrics = ['accuracy', 'precision', 'recall','f1_score', 'roc_auc_score'] n_metric_groups = len(metrics) n_model_bars = 5 group_gap = 0.35 # 组间空白宽度,数值越大空隙越大,可按需调整 bar_width = (1 - group_gap) / n_model_bars x = np.arange(n_metric_groups) RF = [0.62, 0.59, 0.62, 0.57, 0.78] SMOTE = [0.63, 0.62, 0.63, 0.60, 0.79] AdaBoost = [0.27, 0.42, 0.27, 0.28, 0.58] SMOTEBoost = [0.54, 0.60, 0.54, 0.57, 0.68] decoc = [0.63, 0.61, 0.63, 0.58, 0.69] # 自动计算每个系列柱子的偏移,保证整组居中 bar_offsets = np.arange(n_model_bars) * bar_width - (n_model_bars * bar_width / 2 - bar_width/2) plt.bar(x + bar_offsets[0], RF, width=bar_width, label='RF') plt.bar(x + bar_offsets[1], SMOTE, width=bar_width, label='SMOTE') plt.bar(x + bar_offsets[2], AdaBoost, width=bar_width, label='AdaBoost') plt.bar(x + bar_offsets[3], SMOTEBoost, width=bar_width, label='SMOTEBoost') plt.bar(x + bar_offsets[4], decoc, width=bar_width, label='DECOC') plt.xticks(x, metrics) plt.legend(loc='best') plt.ylim(0.0, 1.2) plt.title('Performance Evaluation') plt.xlabel('Performance Metrics') plt.tight_layout() plt.show()
如果需要调整空隙大小,直接修改group_gap的数值即可:比如设为0.4时间距会更宽,设为0.2时间距更窄,柱子宽度会自动适配,不需要手动改其他偏移参数。
内容的提问来源于stack exchange,提问作者arilwan
相关产品推荐
相关产品推荐

