如何用Matplotlib绘制起止点均为负数的垂直条形图?
解决plt.bar绘制自定义起止点(负数区间)垂直条形的问题
嘿,我懂你的困扰——plt.bar默认是从0开始绘制条形的,所以直接传入负数列表,它会画出从0到对应负数的条,完全不是你想要的从-97到-27的区间。不用背景覆盖这种取巧的方法,用plt.bar的bottom参数就能优雅解决!
核心思路
plt.bar的bottom参数可以指定条形的底部起始位置,而height参数是条形的高度(必须为正数,因为高度是长度)。对于你的需求:
- 条形的底部位置设为起始值
-97 - 条形的高度设为结束值 - 起始值(即
-27 - (-97) = 70,正数)
这样matplotlib就会从bottom指定的位置向上绘制对应高度的条形,正好覆盖你要的区间。
修改后的示例代码
import matplotlib.pyplot as plt x = 1 start_y = -97 # 条形的起始点 end_y = -27 # 条形的结束点 plt.subplot(111, frameon=False) plt.ylim(-280, 1) # 关键:设置bottom为起始y值,height为结束与起始的差值 plt.bar(x, end_y - start_y, bottom=start_y, width=0.1) plt.show()
扩展:多个不同起止点的条形
如果要绘制多个起止点不同的负数区间条形,只需要循环处理每个条形的bottom和height即可:
import matplotlib.pyplot as plt x_vals = [1, 2, 3] start_ys = [-97, -150, -200] end_ys = [-27, -80, -120] plt.subplot(111, frameon=False) plt.ylim(-280, 1) # 循环绘制每个条形 for x, start, end in zip(x_vals, start_ys, end_ys): plt.bar(x, end - start, bottom=start, width=0.1) plt.show()
这个方法完全符合你的需求,不需要额外的图层覆盖,是matplotlib原生支持的优雅解决方案~
内容的提问来源于stack exchange,提问作者Burbs
相关产品推荐
相关产品推荐

