上方点击蓝字关注?
前几期我们讲解了线形图和散点图的画法,通过简单地调整参数就能绘制出简洁美观的图形。然而散点图和线形图只能直接地展示数据,并不能从统计学的角度给出数据的分布。接下来就要讲如何用Matplotlib绘制直方图啦,尤其是二维直方图,在实际中有很强的应用价值。
如果我们栏目的知识能帮到你,就请关注、收藏吧!
一维直方图
绘制简单的频次直方图是了解数据的良好开端。只要导入了画图的函数,只用一行代码就能创建一个简易的频次直方图。
data = np.random.randn(1000)
plt.hist(data)
但是如上图所示,直接绘制的直方图颜色是默认的蓝色,也没有调整数据区间的划分和分布的密度。因此要通过调整计算过程和显示效果的选项,来个性化地定制hist()函数的展示效果。
plt.hist(data,bins=30,density=True,alpha=0.5,
histtype='stepfilled',color='steelblue',
edgecolor='none')
其中
data:绘制直方图的数据
bins:参数宜设为整数,用于调整区间数目
density:如果为True,返回的纵轴值是归一化后的结果;如果为‘False’,返回的纵轴值是实际频数。
alpha:调整图形的透明度。
histtype:绘制的直方图类型,有‘bar’,‘barstacked’,‘step’,‘stepfilled’四种选项。
color:设置直方图颜色。
edgecolor:设置边缘颜色。
更多的自定义选项可参考plt.hist()函数的程序文档。
此外,还可以用频次直方图对不同分布特征的样本进行对比。**kwargs参数将在有多个输入数据集的情况下,用于填充默认列表。
x1 = np.random.normal(0,0.8,1000)
x2 = np.random.normal(-2,1,1000)
x3 = np.random.normal(3,2,1000)
kwargs = dict(histtype='stepfilled',density=True,alpha=0.3,bins=40)
plt.hist(x1, **kwargs)
plt.hist(x2, **kwargs)
plt.hist(x3, **kwargs)
如果只需要简单地计算频次直方图,即每段区间的样本数,而并不想画图显示它们,可以直接用np.histogram()函数:
counts, bin_edges = np.histogram(data, bins=10)
print(counts)
输出:
[ 1 22 76 134 227 222 195 76 35 12]
二维直方图
就像将一维数组分为区间创建一维频次直方图一样,我们也可以将二维数组按照二维区间进行划分,来创建二维直方图。下面将简单介绍几种创建二位频次直方图的方法。
首先,用一个多元高斯分布生成x轴与y轴的样本数据:
mean = [0,0]
cov = [[1,1],[1,2]]
x,y = np.random.multivariate_normal(mean, cov, 10000).T
plt.hist2d()函数
画二位频次直方图最简单的方法就是采用plt.hist2d()函数。与plt.hist()函数类似,plt.hist2d()函数也有很多配置选项,配置的方法可参考函数的程序文档。
plt.hist2d(x, y, bins=40, cmap='Blues')
plt.hexbin()函数
二维频次直方图除了由与坐标轴正交方向的方块分割而成,还能通过正六边形分割。Matplotlib提供的plt.hexbin()函数可将二维数据分割为蜂窝状。
plt.hexbin(x, y, gridsize=40, cmap='Blues')
核密度估计
还有一种评估多维数据分布密度的常用方法是核密度估计(KDE)。KDE方法的原理是抹去空间中离散的数据点,从而拟合出一个平滑的函数。
# 拟合数组维度
data = np.vstack([x, y])
kde = gaussian_kde(data)
# 用一对规则的网络数据进行拟合
xgrid = np.linspace(-3.5, 3.5, 200)
ygrid = np.linspace(-6, 6, 200)
Xgrid, Ygrid = np.meshgrid(xgrid, ygrid)
Z = kde.evaluate(np.vstack([Xgrid.ravel(), Ygrid.ravel()]))
# 画出结果图
plt.imshow(Z.reshape(Xgrid.shape),
origin='lower',aspect='auto',
extent=[-3.5, 3.5, -6, 6],cmap='Blues')
本期案例
代码
本期给大家带来的案例是“北京市公共交通节点分布图”的画法。需要用到北京市的公共交通节点数据。绘制的方法很简单,话不多说,请看代码!
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
bjs = pd.read_csv('Traffic_node.csv')
lat = bjs['lat']
lon = bjs['lon']
fig = plt.figure()
plt.hist2d(lon,lat,bins = 300,
cmap = 'Blues')
plt.xlabel('longitude')
plt.ylabel('latitude')
plt.xlim(115.3,117.6)
plt.ylim(39.3,41)
plt.clim(0,30)
plt.show()
其中,‘Traffic_node.csv’文件的内容为北京市公共交通节点的经纬度,数据样例如下:
好哒,以上就是本期的全部内容啦!
我们是一个有灵魂的团队,坚持探索,致力于分享交流学习经验。想要学习更多Python编程知识的小伙伴就请持续关注我们的栏目吧~
编辑:庄桢
“交通科研Lab”:分享学习点滴,期待科研交流!
如果觉得还不错
点这里!???