Inf*_*ano 5 python statistics plot numpy matplotlib
我正在使用Python及其一些扩展来获取和绘制概率密度函数.虽然我设法以它的形式进行策划,但至少,我无法成功地划分轴线.
import decimal
import numpy as np
import scipy.stats as stats
import pylab as pl
import matplotlib.pyplot as plt
from decimal import *
from scipy.stats import norm
lines=[]
fig, ax = plt.subplots(1, 1)
mean, var, skew, kurt = norm.stats(moments='mvsk')
#Here I delete some lines aimed to fill the list with values
Long = len(lines)
Maxim = max(lines) #MaxValue
Minim = min(lines) #MinValue
av = np.mean(lines) #Average
StDev = np.std(lines) #Standard Dev.
x = np.linspace(Minim, Maxim, Long)
ax.plot(x, norm.pdf(x, av, StDev),'r-', lw=3, alpha=0.9, label='norm pdf')
weights = np.ones_like(lines)/len(lines)
ax.hist(lines, weights = weights, normed=True, histtype='stepfilled', alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果是
虽然我想表达它 - 在x轴中心为0并且与标准偏差有关 - 在y轴上,与直方图和%s相关(标准化为1)
对于x轴为图片如下
就像y轴的最后一张图片一样

我已经设法通过直接用指令权重=权重绘制并将其设置到绘图中来升级直方图中的y轴,但我不能在这里做.我将它包含在代码中但实际上在这种情况下它什么都不做.
任何帮助,将不胜感激
y 轴以某种方式标准化,即曲线下的面积为 1。如果您无论如何都使用 进行归一化,则为每个数据点添加相等的权重是没有意义的normed=True。
首先你需要将数据移至 0:
lines -= mean(lines)
Run Code Online (Sandbox Code Playgroud)
然后绘制它。
y这应该是一个工作的最小示例:
import numpy as np
from numpy.random import normal
import matplotlib.pyplot as plt
from scipy.stats import norm
# gaussian distributed random numbers with mu =4 and sigma=2
x = normal(4, 2, 10000)
mean = np.mean(x)
sigma = np.std(x)
x -= mean
x_plot = np.linspace(min(x), max(x), 1000)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(x, bins=50, normed=True, label="data")
ax.plot(x_plot, norm.pdf(x_plot, mean, sigma), 'r-', label="pdf")
ax.legend(loc='best')
x_ticks = np.arange(-4*sigma, 4.1*sigma, sigma)
x_labels = [r"${} \sigma$".format(i) for i in range(-4,5)]
ax.set_xticks(x_ticks)
ax.set_xticklabels(x_labels)
plt.show()
Run Code Online (Sandbox Code Playgroud)
输出图像是这样的:

而且你进口的东西太多了。你导入decimals两次,一次甚至使用*
,然后 numpy、pyplot 和 scipy 都包含在 pylab 中。另外为什么导入整个 scipy.stats 然后再次从中导入规范?