Python - Matplotlib:在绘制概率密度函数时标准化轴

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轴,但我不能在这里做.我将它包含在代码中但实际上在这种情况下它什么都不做.

任何帮助,将不胜感激

Max*_*Noe 3

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 然后再次从中导入规范?