文章目录(Table of Contents)
简介
这里会介绍绘制直方图的一些方式。其实绘制直方图可以使用plt.hist来进行绘制,参考连接 : Python数据处理之Matplotlib学习--直方图绘制。但是直方图的绘制有个问题(主要是我对直方图的操作不是很熟练),所以画一些好看的图比较麻烦。
于是这里我们会使用numpy.histogram来先完成直方图的统计,在使用柱状图来进行绘制。
numpy.histogram的介绍
这里我们简单介绍一下numpy.histogram的使用,看一下他的输入和输出。下面是一个简单的例子。
- # 生成一些随机数
- rng = np.random.RandomState(10)
- data1 = rng.normal(size=1000)
- data2 = rng.normal(size=1000)
- # 查看np.histogram的输出
- binRange = np.arange(-1,1,0.1)
- print(binRange)
- np.histogram(data1, bins=binRange)
关于np.histogram的输入,data1表示需要统计的数据, binRange是按照这里的区间进行统计。在这里binRange生成如下,表示从-1到1, 每隔0.1取一个。np.histogram就会统计各个区间的个数,如data1在[-1, -0.9)之间样本的个数。
- [-1.00000000e+00 -9.00000000e-01 -8.00000000e-01 -7.00000000e-01
- -6.00000000e-01 -5.00000000e-01 -4.00000000e-01 -3.00000000e-01
- -2.00000000e-01 -1.00000000e-01 -2.22044605e-16 1.00000000e-01
- 2.00000000e-01 3.00000000e-01 4.00000000e-01 5.00000000e-01
- 6.00000000e-01 7.00000000e-01 8.00000000e-01 9.00000000e-01]
我们简单看一下np.histogram的输出。他的输出有两个部分:
- 第一个部分表示每个区间的统计个数;
- 第二个部分表示每个区间的边界;
显示百分比
有的时候, 我们可以显示占比而不是具体的个数, 我们可以使用density=True这个参数来进行设置. 需要注意的是, 在使用density=True的时候, 最后计算出来的结果不一定是1, 而是要和区间的大小进行加权之后是1. 我们看下面的一个例子.
- rng=np.random.RandomState(10)
- data1=rng.normal(size=1000)
- bin_range=[-1,0,2] # 设置区间, 分别是[-1,0]和[0,2]
- # 计算每一个区间所占的百分比
- hist,_ = np.histogram(data1, bin_range, density=True)
- hist
- """
- array([0.42822678, 0.28588661])
- """
可以看到这里计算出的百分比的和不是1, 这个百分比需要和区间大小进行考虑. 我们分别使用区间大小乘以每一个范围所占的比分比, 结果就是1了.
- np.sum(hist*np.array([1,2]))
- """
- 1.0
- """
np.histogram结合plt.bar绘制直方图
这一部分我们简单介绍一下使用bar来达到hist一样的效果。
绘制多个直方图
首先介绍绘制多个直方图在同一张图中。我们可以看一下下面的例子。就是先用np.histogram统计出每一个区间内data的分布,接着使用plt.bar进行绘制即可。
注意直方图的位置需要通过第一个参数x-w(这个算出的是柱中间的坐标,左右各0.5*w)和width来进行调节。
- hist1,_ = np.histogram(data1, bins=binRange)
- hist2,_ = np.histogram(data2, bins=binRange)
- # 绘制图像
- fig, ax1 = plt.subplots()
- fig.set_size_inches(10, 6)
- plt.set_cmap('RdBu')
- x = np.arange(len(binRange)-1)*3
- w=0.3
- # 绘制多个bar在同一个图中, 这里需要控制width
- plt.bar(x-w, hist1, width = 2*w, align='center')
- plt.bar(x+w, hist2, width = 2*w, align='center')
- # 设置坐标轴的标签
- ax1.yaxis.set_tick_params(labelsize=15) # 设置y轴的字体的大小
- ax1.set_xticks(x) # 设置xticks出现的位置
- # 设置坐标轴名称
- ax1.set_ylabel("Count", fontsize='xx-large')
- # 设置标题
- ax1.set_title('The Distribution of Normal1 Data and Normal2 Data', fontsize='x-large')
- # 设置图例
- plt.legend(('Normal1','Nomral2'),fontsize = 'x-large', loc='upper right')
- plt.show()
最终的绘制的效果如下图所示:
绘制堆叠直方图
对于有两类的数据,我们除了上面这样两个绘制在一起,我们还可以绘制为堆叠的样式,下面简单看一下例子。
这一部分的使用基本是和上面是一样的,唯一的不同就是第二个需要加上bottom=hist1,也就是在hist1上面绘制hist2的内容。
- hist1,_ = np.histogram(data1, bins=binRange)
- hist2,_ = np.histogram(data2, bins=binRange)
- # 绘制图像
- fig, ax1 = plt.subplots()
- fig.set_size_inches(10, 6)
- plt.set_cmap('RdBu')
- x = np.arange(len(binRange)-1)*3
- w=1
- # 绘制多个bar在同一个图中, 这里需要控制width
- plt.bar(x, hist1, width = 2*w, align='center')
- plt.bar(x, hist2, width = 2*w, align='center', bottom=hist1)
- # 设置坐标轴的标签
- ax1.yaxis.set_tick_params(labelsize=15) # 设置y轴的字体的大小
- ax1.set_xticks(x) # 设置xticks出现的位置
- # 设置坐标轴名称
- ax1.set_ylabel("Count", fontsize='xx-large')
- # 设置标题
- ax1.set_title('The Distribution of Normal1 Data and Normal2 Data', fontsize='x-large')
- # 设置图例
- plt.legend(('Normal1','Nomral2'),fontsize = 'x-large', loc='upper right')
- plt.show()
最终绘制的结果如下图所示:
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论