Matplotlib水平条形图:实现标签超出Y轴时自动裁剪
解决Matplotlib水平条形图标签超出Y轴时的裁剪问题
我绘制了一个水平条形图,希望在条形内部添加标签,但当标签超出Y轴时需要被裁剪。我的代码如下:
import matplotlib.pyplot as plt labels = ['Book 1', 'Book 2', 'Book 3'] values = [20, 35, 5] fig, ax = plt.subplots() y_pos = range(len(labels)) ax.barh(y_pos, values, align='center', color='blue') for i, v in enumerate(values): ax.text(v, i, "TESTSTETSTSTS", color='grey', va='center', ha='right') ax.set_yticks(y_pos) ax.set_yticklabels(labels) ax.invert_yaxis() ax.set_xlabel('Number') ax.set_title('Number of sold books') plt.show()
当前问题:标签超出Y轴左侧边界时完整显示,未被裁剪;期望效果:标签超出条形图区域(Y轴左侧)的部分被自动裁剪,仅保留条形内部可见的内容。
解决方法
核心是给文本添加裁剪属性,修改后的代码如下:
import matplotlib.pyplot as plt labels = ['Book 1', 'Book 2', 'Book 3'] values = [20, 35, 5] fig, ax = plt.subplots() y_pos = range(len(labels)) ax.barh(y_pos, values, align='center', color='blue') for i, v in enumerate(values): # 启用裁剪,超出坐标轴范围的文本会被自动裁剪 ax.text(v, i, "TESTSTETSTSTS", color='grey', va='center', ha='right', clip_on=True) ax.set_yticks(y_pos) ax.set_yticklabels(labels) ax.invert_yaxis() ax.set_xlabel('Number') ax.set_title('Number of sold books') plt.show()
关键修改说明:
- 添加
clip_on=True参数:开启文本的裁剪功能,Matplotlib会自动将超出当前坐标轴显示范围的文本部分裁剪掉 - 无需额外指定裁剪区域,默认裁剪范围就是当前坐标轴的边界,刚好满足标签超出Y轴左侧时被裁剪的需求
如果需要更精确的裁剪控制,也可以通过clip_box参数指定自定义裁剪区域,比如仅限制在条形内部,但对于当前需求,clip_on=True已经足够解决问题。
内容的提问来源于stack exchange,提问作者Palladium46
相关产品推荐
相关产品推荐

