直方图(Histogram),一种数据统计层面的绘图方式。用一系列高低不等的柱子表示数据分布,横坐标表示数据划分区间,纵坐标可以表示落到各个区间内的频数/频率。使用matplotlib.pyplot 库中的hist 方法实现,先看函数的参数:官方link matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)
x 是输入的数据,一般是一维数组,必填项。bins 是数据划分的组数,可以根据实际情况自己设置,也可以默认适配。range 需要tuple类型数据(x_min,x_max) ,表示bin的下界和上届,也可以默认。density 当你需要纵轴显示频率 时,将该参数设置为True 。其中,内部是通过该公式计算的频率density = counts / (sum(counts) * np.diff(bins))np.sum(density * np.diff(bins)) == 1 。如果stacked 也是True ,则直方图的总和归一化为 1。(尝试了一下,有些数据不知道为啥纵坐标会大于1)weights 与x形状相同的权重数组。x中的每个值仅将其相关权重贡献给 bin 计数(而不是 1)。如果密度为True,则权重被归一化,因此密度在该范围内的积分保持为 1。
weights = np.array(p) / len(p)
n, bins, patches=plt.hist(p,weights=weights)
注意:normed 该属性已经被官方弃用,显示频率分布就看上述两种方式是否符合你的要求。
官方示例:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(19680801)
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, density=True, facecolor='g', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.xlim(40, 160)
plt.ylim(0, 0.03)
plt.grid(True)
plt.show()
其他多种基本图绘制方法可以参考这里
|