matplotlib 直方图_简洁优雅的Matplotlib数据可视化(四) 绘制直方图

上方点击蓝字关注?

a5441f26d0f17526a494e97a75f155b5.png

前几期我们讲解了线形图和散点图的画法,通过简单地调整参数就能绘制出简洁美观的图形。然而散点图和线形图只能直接地展示数据,并不能从统计学的角度给出数据的分布。接下来就要讲如何用Matplotlib绘制直方图啦,尤其是二维直方图,在实际中有很强的应用价值。

如果我们栏目的知识能帮到你,就请关注、收藏吧!

291b0f55e9b6f6bf71b5193367e41f15.gif

一维直方图

绘制简单的频次直方图是了解数据的良好开端。只要导入了画图的函数,只用一行代码就能创建一个简易的频次直方图。

data = np.random.randn(1000)
plt.hist(data)
9714205123da963316cf282d49b26516.png

但是如上图所示,直接绘制的直方图颜色是默认的蓝色,也没有调整数据区间的划分和分布的密度。因此要通过调整计算过程和显示效果的选项,来个性化地定制hist()函数的展示效果。

plt.hist(data,bins=30,density=True,alpha=0.5,
         histtype='stepfilled',color='steelblue',
         edgecolor='none')
0bf9bd0e45bd8721d3d9ead49b74180c.png

其中

  • 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)
370c9fa329d7b904939b3ddf41dea060.png

如果只需要简单地计算频次直方图,即每段区间的样本数,而并不想画图显示它们,可以直接用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')
bb1530329e6e942120e99a6325b4877b.png

plt.hexbin()函数

二维频次直方图除了由与坐标轴正交方向的方块分割而成,还能通过正六边形分割。Matplotlib提供的plt.hexbin()函数可将二维数据分割为蜂窝状。

plt.hexbin(x, y, gridsize=40, cmap='Blues')
3f3493d57fa0c17e0f598c8746825e55.png

核密度估计

还有一种评估多维数据分布密度的常用方法是核密度估计(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')
75d0c480c377e149b4e22089254217b1.png

本期案例

代码

本期给大家带来的案例是“北京市公共交通节点分布图”的画法。需要用到北京市的公共交通节点数据。绘制的方法很简单,话不多说,请看代码!

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()
b0dd782ec2d1d2159508aea6b5a5d34b.png

其中,‘Traffic_node.csv’文件的内容为北京市公共交通节点的经纬度,数据样例如下:

34e711ef4a4b1a0f10f5d33a24986bd0.png

好哒,以上就是本期的全部内容啦!

我们是一个有灵魂的团队,坚持探索,致力于分享交流学习经验。想要学习更多Python编程知识的小伙伴就请持续关注我们的栏目吧~

编辑:庄桢

173399cdac5fbd91aae87c1de87864c2.gif

“交通科研Lab”:分享学习点滴,期待科研交流!

f28835f44e1e5ac9b3d508421041e70b.png

如果觉得还不错

点这里???

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值