在直方图上绘制一个函数线

22
我正在尝试使用SciPy进行统计分析和matplotlib进行绘图,在Python中进行一些分布图绘制和拟合。对于一些事情,比如创建直方图,我运气不错。
seed(2)
alpha=5
loc=100
beta=22
data=ss.gamma.rvs(alpha,loc=loc,scale=beta,size=5000)
myHist = hist(data, 100, normed=True)

enter image description here

太棒了!
我甚至可以使用相同的伽马参数,并绘制概率分布函数的线性函数(在一些搜索之后)。
rv = ss.gamma(5,100,22)
x = np.linspace(0,600)
h = plt.plot(x, rv.pdf(x))

enter image description here

如何在直方图“myHist”上叠加概率密度函数线“h”?我希望这个问题很简单,但是我一直无法弄清楚。

1
http://matplotlib.sourceforge.net/examples/api/histogram_demo.html - jfs
你可能在不同的图形上绘制直方图和折线图。如果你只是在同一个图形上调用hist和plot函数,那么它们就应该重叠在一起。 - Dhara
@Dhara,就是这样。我正在使用IPython笔记本,并且正在做同样的事情。 - JD Long
这里有所有的scipy.stats分布概率密度函数以及示例代码。 - tmthydvnprt
3个回答

19

只需要把两部分组合在一起。

import scipy.stats as ss
import numpy as np
import matplotlib.pyplot as plt
alpha, loc, beta=5, 100, 22
data=ss.gamma.rvs(alpha,loc=loc,scale=beta,size=5000)
myHist = plt.hist(data, 100, normed=True)
rv = ss.gamma(alpha,loc,beta)
x = np.linspace(0,600) 
h = plt.plot(x, rv.pdf(x), lw=2)
plt.show()

在此输入图片描述

为确保在任何特定的绘图实例中获得所需内容,请尝试首先创建一个figure对象。

import scipy.stats as ss
import numpy as np
import matplotlib.pyplot as plt
# setting up the axes
fig = plt.figure(figsize=(8,8))
ax  = fig.add_subplot(111)
# now plot
alpha, loc, beta=5, 100, 22
data=ss.gamma.rvs(alpha,loc=loc,scale=beta,size=5000)
myHist = ax.hist(data, 100, normed=True)
rv = ss.gamma(alpha,loc,beta)
x = np.linspace(0,600)
h = ax.plot(x, rv.pdf(x), lw=2)
# show
plt.show()

3
我遇到的问题是,我正在使用 iPython Notebook。当我运行一个图表时,它会以交互方式绘制,然后我做一些操作并绘制另一个图表,结果它会出现在一个新的图表中。感谢您帮助我解决这个问题! - JD Long

10

您可能对绘制任何直方图的分布函数感兴趣。 这可以使用seaborn kde函数来完成。

import numpy as np # for random data
import pandas as pd  # for convinience
import matplotlib.pyplot as plt  # for graphics
import seaborn as sns  # for nicer graphics

v1 = pd.Series(np.random.normal(0,10,1000), name='v1')
v2 = pd.Series(2*v1 + np.random.normal(60,15,1000), name='v2')

# plot a kernel density estimation over a stacked barchart
plt.figure()
plt.hist([v1, v2], histtype='barstacked', normed=True);
v3 = np.concatenate((v1,v2))
sns.kdeplot(v3);
plt.show()

这里输入图片描述来自Coursera的Python数据可视化课程。


6

针对Malik的回答,尽可能地使用原生NumPy、SciPy和Matplotlib进行扩展。我引入了Seaborn,但它仅用于提供更好的默认设置和微小视觉调整:

import numpy as np
import scipy.stats as sps
import matplotlib.pyplot as plt

import seaborn as sns
sns.set(style='ticks')

# parameterise our distributions
d1 = sps.norm(0, 10)
d2 = sps.norm(60, 15)

# sample values from above distributions
y1 = d1.rvs(300)
y2 = d2.rvs(200)
# combine mixture
ys = np.concatenate([y1, y2])

# create new figure with size given explicitly
plt.figure(figsize=(10, 6))

# add histogram showing individual components
plt.hist([y1, y2], 31, histtype='barstacked', density=True, alpha=0.4, edgecolor='none')

# get X limits and fix them
mn, mx = plt.xlim()
plt.xlim(mn, mx)

# add our distributions to figure
x = np.linspace(mn, mx, 301)
plt.plot(x, d1.pdf(x) * (len(y1) / len(ys)), color='C0', ls='--', label='d1')
plt.plot(x, d2.pdf(x) * (len(y2) / len(ys)), color='C1', ls='--', label='d2')

# estimate Kernel Density and plot
kde = sps.gaussian_kde(ys)
plt.plot(x, kde.pdf(x), label='KDE')

# finish up
plt.legend()
plt.ylabel('Probability density')
sns.despine()

给我们以下的图表:

镜头中的钞票

在生成相对漂亮的输出时,我尝试坚持使用最小的特性集,特别是使用SciPy来估计KDE非常容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接