Python 如何使用matplotlib绘制中心值不是零的垂直直方图

Python 如何使用matplotlib绘制中心值不是零的垂直直方图,python,matplotlib,Python,Matplotlib,我使用以下代码绘制一些数据: self.arms = df['arms'].iloc[-self.plotlength:] self.armsup = [0 if i < 1.0 else log(i, 10) for i in self.arms] self.armsdn = [0 if i > 1.0 else log(i, 10) for i in self.arms] a1.plot(self.x, self.openarms - 1, color='k') a1.vlin

我使用以下代码绘制一些数据:

self.arms = df['arms'].iloc[-self.plotlength:]
self.armsup = [0 if i < 1.0 else log(i, 10) for i in self.arms]
self.armsdn = [0 if i > 1.0 else log(i, 10) for i in self.arms]

a1.plot(self.x, self.openarms - 1, color='k')
a1.vlines(self.x, 0, self.armsup, color='g')
a1.vlines(self.x, 0, self.armsdn, color='r')
self.arms=df['arms'].iloc[-self.plotlength:]
self.armsup=[0如果i<1.0,则为self.arms中的i记录(i,10)]
self.armsdn=[0如果i>1.0,则为self.arms中的i记录(i,10)]
a1.绘图(self.x,self.openarms-1,color='k')
a1.V线(self.x,0,self.armsup,color='g')
a1.vlines(self.x,0,self.armsdn,color='r')
具有以下结果(下图表剪辑)


直方图当前以零为中心。它真的应该以一个为中心。目前我正在通过减去一来调整数据。如何绘制在任意数字(如1)上下摆动的垂直线

看起来您正在对
self.arms
中的每个值进行日志记录,并且您知道中值应该在1.0左右。所以不是

self.arms = df['arms'].iloc[-self.plotlength:]
self.armsup = [0 if i < 1.0 else log(i, 10) for i in self.arms]
self.armsdn = [0 if i > 1.0 else log(i, 10) for i in self.arms]
具有调用签名
np。其中(cond,x,y)
其中
cond
是一个布尔数组,
x
y
是与
cond
长度相同的数组,以及
np.where(cond,x,y)
x
返回值,其中
cond
为真,从
y
返回值,其中
cond
为假

比如说,

import numpy as np
import matplotlib.pyplot as plt

N = 100
arms = np.random.uniform(0.5, 4.0, N)
log_arms = np.log(arms)
threshold = 1
mask = log_arms > threshold
armsup = np.where(mask, log_arms, threshold)
armsdn = np.where(~mask, log_arms, threshold)

fig, ax = plt.subplots()
x = np.arange(N)
ax.vlines(x, threshold, armsup, color='g')
ax.vlines(x, armsdn, threshold, color='r')
plt.show()
屈服

这是我尝试的第一件事。这是结果,数据为原始的base one形式。我想要的是一根线的上升和下降。数据范围从0.5到4.0左右,其中一根是中性的。因此,理想的结果是1上方的绿色条和1下方的红色条。检查
armsup
armsdn
的值。请注意,在原始图形中,最大
armsup
值约为0.5。与最大
armsup
值超过3的进行比较。无法将1添加到
armsup
将生成第二个图形。所以我不知道你的错误在哪里,但它不在你(或我)发布的代码中。我将在上面添加它。
self.arms
的范围是0.5到4.0吗?
self.arms = df['arms'].iloc[-self.plotlength:]
log_arms = np.log(self.arms)
threshold = 1
mask = log_arms > threshold
armsup = np.where(mask, log_arms, threshold)
armsdn = np.where(~mask, log_arms, threshold)
import numpy as np
import matplotlib.pyplot as plt

N = 100
arms = np.random.uniform(0.5, 4.0, N)
log_arms = np.log(arms)
threshold = 1
mask = log_arms > threshold
armsup = np.where(mask, log_arms, threshold)
armsdn = np.where(~mask, log_arms, threshold)

fig, ax = plt.subplots()
x = np.arange(N)
ax.vlines(x, threshold, armsup, color='g')
ax.vlines(x, armsdn, threshold, color='r')
plt.show()