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

如何在Matplotlib柱状图中设置数值标签的显示方向(部分垂直、部分水平)以保证清晰性

如何在Matplotlib柱状图中设置数值标签的显示方向(部分垂直、部分水平)以保证清晰性

嗨,我明白你的需求啦——就是想让柱状图上的数值标签能智能调整显示方向,有些水平、有些垂直,保证所有标签都清晰不挤在一起对吧?这就给你调整代码实现这个效果~

首先看你原来的代码,所有标签都是水平显示的,当柱子间距小或者标签内容长的时候就容易重叠。我们只需要在添加标签的循环里加个判断逻辑,根据你需要的规则(比如月份位置、数值长度、柱子高度)来决定要不要旋转标签就行。

修改后的完整代码

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 先模拟你的数据框(实际使用时替换成自己的df即可)
df = pd.DataFrame({
    month: np.random.randint(10, 100, 20) 
    for month in ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']
})

x2 = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']
y3 = []
for value in x2:
    y3.append((df[value].sum())/(len(df[value])))

plt.bar(x2, y3, color=('lightblue','salmon'))

for i, v in enumerate(y3):
    # 把数值格式化,保留两位小数让标签更简洁(可选)
    label_str = f"{v:.2f}"
    # 这里设置判断规则:比如最后3个月份(OCT、NOV、DEC)的标签垂直显示,其他水平
    if i >= 9:
        # 旋转90度垂直显示,同时设置水平居中对齐柱子
        plt.text(i, v + 0.5, label_str, fontsize=6, rotation=90, ha='center')
    else:
        # 水平显示,微调x位置避免偏移
        plt.text(i - 0.25, v + 0.5, label_str, fontsize=6)

# 自动调整布局,防止标签被图表边缘截断
plt.tight_layout()
plt.show()

关键细节说明

  • 旋转控制:用rotation=90实现垂直显示,如果你想让标签倒过来可以用rotation=270
  • 对齐优化:垂直显示时加上ha='center',能让标签精准对齐柱子顶部,不会歪歪扭扭
  • 灵活调整判断规则:你完全可以根据自己的数据改判断条件:
    • 比如数值太长时旋转:if len(label_str) > 3
    • 比如矮柱子上的标签旋转:if v < 15(避免和柱子重叠)
    • 或者指定特定月份:if x2[i] in ['OCT', 'NOV', 'DEC']
  • 位置微调:v + 0.5是让标签在柱子上方留一点空隙,这个值可以根据你的y轴范围改,比如y轴最大值是50,就用v + 1

额外优化小技巧

如果你的柱子颜色和标签颜色接近,还可以给标签加个半透明背景,保证可读性:

# 在plt.text里加bbox参数
plt.text(i, v + 0.5, label_str, fontsize=6, rotation=90, ha='center',
         bbox=dict(facecolor='white', alpha=0.7, pad=1))

备注:内容来源于stack exchange,提问作者Chakradhar Kalla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:33:02