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

如何用Matplotlib绘制以1为中心而非0的垂直直方图

搞定以1为中心的垂直线绘制问题

嘿,我看了你的代码,现在的问题是你画的垂直线都是从0开始延伸,所以中心自然在0。要改成以1为中心,只需要调整几个关键地方就行,很简单:

首先,咱们得把基准线移到y=1的位置,然后让垂直线从1开始向上或向下延伸,而不是从0。修改后的代码如下:

self.arms = df['arms'].iloc[-self.plotlength:]
# 计算每个值相对于1的log10偏移:大于1的是正偏移,小于1的是负偏移
self.arms_offset = [log(i, 10) if i != 1 else 0 for i in self.arms]
# 拆分出向上和向下的偏移(也可以不用拆分,直接用正负值,这里保持你原来的变量结构)
self.armsup = [offset if offset > 0 else 0 for offset in self.arms_offset]
self.armsdn = [offset if offset < 0 else 0 for offset in self.arms_offset]

# 绘制以1为中心的基准线(如果你的openarms本来是围绕1的,也可以用a1.plot(self.x, self.openarms, color='k'))
a1.plot(self.x, [1]*len(self.x), color='k')
# 向上的绿色线:从1开始,延伸到1+armsup的位置
a1.vlines(self.x, 1, 1 + self.armsup, color='g')
# 向下的红色线:从1开始,延伸到1+armsdn的位置(因为armsdn是负数,所以终点会低于1)
a1.vlines(self.x, 1, 1 + self.armsdn, color='r')

为啥这么改?

原来的代码里:

  • armsup是当arms≥1时取log10值,否则0,垂直线从0画到这个值,所以是往上延伸到0以上
  • armsdn是当arms≤1时取log10值(这时候是负数),垂直线从0画到这个负数,往下延伸

现在改成以1为中心后:

  • 所有偏移都是相对于1的,大于1的部分产生正偏移,小于1的产生负偏移
  • 垂直线从1开始,向上的线到1+正偏移,向下的线到1+负偏移,这样整个图形的中心就落在1上了
  • 基准线也直接放在y=1的位置,完美匹配你的需求

另外,你原来的a1.plot(self.x, self.openarms - 1, color='k')是把基准线往下挪了1,现在如果openarms本身就是围绕1波动的,你可以直接用a1.plot(self.x, self.openarms, color='k')来替代那条固定的y=1线,这样基准线会跟着数据走,但中心还是1。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:29:18