如何解决Matplotlib分组柱状图的标签重叠问题?
解决分组柱状图标签重叠问题
我用Python绘制分组柱状图对比不平衡与平衡数据的模型性能,但柱状图上方的数值标签出现重叠,调整padding或缩小字体效果不佳(字体需调至极小才不重叠,可读性差)。以下是无需缩小字体即可解决重叠的几种方法:
方法1:垂直旋转标签
给bar_label添加rotation参数,将标签垂直显示,避免横向重叠:
# 修改bar_label部分代码 ax.bar_label(rects1, padding=5, fmt='%.2f', label_type='edge', rotation=90) ax.bar_label(rects2, padding=5, fmt='%.2f', label_type='edge', rotation=90) ax.bar_label(rects3, padding=5, fmt='%.2f', label_type='edge', rotation=90)
如果90度旋转后仍有问题,可尝试rotation=45斜向显示,同时微调padding值。
方法2:将标签放在柱子内部
把数值标签移到柱子顶部内侧,既避免外部重叠,还能保持字体大小:
ax.bar_label(rects1, padding=-15, fmt='%.2f', label_type='center', color='white') ax.bar_label(rects2, padding=-15, fmt='%.2f', label_type='center', color='white') ax.bar_label(rects3, padding=-15, fmt='%.2f', label_type='center', color='white')
padding=-15控制标签在柱子内的位置(负数表示向内偏移)color='white'让浅色标签在深色柱子上更清晰,可根据柱子颜色调整
方法3:缩小柱子宽度,增加横向空间
适当减小柱子宽度,给每组的三个柱子留出更多间隙,标签自然不会重叠:
width = 0.18 # 从原来的0.2缩小到0.18 rects1 = ax.bar(x - width, imbalancedResults, width, label='Imbalanced Dataset') rects2 = ax.bar(x , rusResults, width, label='RandomUnderSampler') rects3 = ax.bar(x + width, smoteResults, width, label='SMOTE')
同时可微调figsize增大图表宽度,比如fig, ax = plt.subplots(figsize=(12,9)),进一步提升横向空间。
方法4:错开标签高度
手动调整每组标签的垂直位置,让不同柱子的标签上下错开:
# 给每组标签设置不同的垂直偏移 for label in ax.bar_label(rects1, fmt='%.2f', label_type='edge'): label.set_y(label.get_position()[1] + 0.02) # 第一组标签抬高0.02 for label in ax.bar_label(rects2, fmt='%.2f', label_type='edge'): label.set_y(label.get_position()[1] + 0.04) # 第二组抬高0.04 for label in ax.bar_label(rects3, fmt='%.2f', label_type='edge'): label.set_y(label.get_position()[1] + 0.06) # 第三组抬高0.06
偏移量可根据实际数值范围调整,确保标签不重叠且清晰可见。
内容的提问来源于stack exchange,提问作者sums22
相关产品推荐
相关产品推荐

