Python 直方图Matplotlib vs Numpy

Python 直方图Matplotlib vs Numpy,python,numpy,matplotlib,histogram,Python,Numpy,Matplotlib,Histogram,我试图从一维直方图中得到1-sigma(或2-sigma)值。我不需要这个情节,但为了确保它是正确的,我决定把它画出来。但与matplotlib直方图相比,它有点不太合适。 这里是一个简单的MWE。这是正确的吗 import numpy as np import matplotlib.pyplot as plt a=np.array([-100,100,9,-9,2,-2,3,-3,5,-5]) #matplotlib histogram plt.figure(),plt.hist(a)

我试图从一维直方图中得到1-sigma(或2-sigma)值。我不需要这个情节,但为了确保它是正确的,我决定把它画出来。但与matplotlib直方图相比,它有点不太合适。 这里是一个简单的MWE。这是正确的吗

import numpy as np
import matplotlib.pyplot as plt

a=np.array([-100,100,9,-9,2,-2,3,-3,5,-5])

#matplotlib histogram
plt.figure(),plt.hist(a)

#numpy histogram
ha,ba = np.histogram(a)
plt.figure()
plt.plot(ba[:-1],ha)
sigma = 1
sigmaleft  = ha.mean() - sigma * ha.std()
sigmaright = ha.mean() + sigma * ha.std()
print([sigmaleft, sigmaright])

变量
ba
ha中返回,ba=np。直方图(a)
是bin边,这就是为什么直方图数据
ha
中多了一个元素的原因。要“正确”绘图,请将x轴设置为料仓中心:

bc = 0.5 * (ba[:-1] + ba[1:])
plt.bar(bc, ha)
只是为了好玩,你也可以写作

bc = np.lib.stride_tricks.as_strided(ba, strides=ba.strides * 2, shape=(2, ba.size - 1)).mean(0)
总之,
ha.std
不是数据标准偏差的良好近似值,正如
ha.mean
是平均值一样。仓位计数只是权重,而数据是在x轴上编码的。平均值可以近似为

approxMean = (bc * ha).sum() / ha.sum()
同样,您可以对标准偏差执行以下操作:

approxStd = np.sqrt(((bc - approxMean)**2 * ha).sum() / ha.sum())
您还可以使用替代公式:

approxStd = np.sqrt((bc**2 * ha).sum() / ha.sum() - ((bc * ha) / ha.sum()).sum()**2)

在所有情况下,只有在无法访问真实数据的情况下才能执行此操作。计算平均值和标准偏差将比直方图更加准确。

变量
ba
ha中返回,ba=np。直方图(a)
是bin边,这就是为什么直方图数据
ha
中多了一个元素。要“正确”绘图,请将x轴设置为料仓中心:

bc = 0.5 * (ba[:-1] + ba[1:])
plt.bar(bc, ha)
只是为了好玩,你也可以写作

bc = np.lib.stride_tricks.as_strided(ba, strides=ba.strides * 2, shape=(2, ba.size - 1)).mean(0)
总之,
ha.std
不是数据标准偏差的良好近似值,正如
ha.mean
是平均值一样。仓位计数只是权重,而数据是在x轴上编码的。平均值可以近似为

approxMean = (bc * ha).sum() / ha.sum()
同样,您可以对标准偏差执行以下操作:

approxStd = np.sqrt(((bc - approxMean)**2 * ha).sum() / ha.sum())
您还可以使用替代公式:

approxStd = np.sqrt((bc**2 * ha).sum() / ha.sum() - ((bc * ha) / ha.sum()).sum()**2)

在所有情况下,只有在无法访问真实数据的情况下才能执行此操作。计算平均值和标准偏差比计算直方图要准确得多。

第二张图表是一个折线图,而不是直方图。numpy函数返回bin边。尝试使用
0.5*(ba[:-1]+ba[1:])
作为x轴。第二个图表是一个折线图,而不是直方图。numpy函数返回bin边。尝试使用
0.5*(ba[:-1]+ba[1:])
作为x轴。把它做成一个合适的条形图