Matplotlib学习---用matplotlib画直方图/密度图(histogram, density plot)
直方图用于展示数据的分布情况,x轴是一个连续变量,y轴是该变量在一定区间内的频次。
下面利用Nathan Yau所著的《鲜活的数据:数据可视化指南》一书中的数据,学习画图。
数据地址:http://datasets.flowingdata.com/crimeRatesByState2005.csv
以下是这个数据文件的前5行:
state murder forcible_rape robbery aggravated_assault \ 0 United States 5.6 31.7 140.7 291.1 1 Alabama 8.2 34.3 141.4 247.8 2 Alaska 4.8 81.1 80.9 465.1 3 Arizona 7.5 33.8 144.4 327.4 4 Arkansas 6.7 42.9 91.1 386.8 burglary larceny_theft motor_vehicle_theft population 0 726.7 2286.3 416.7 295753151 1 953.8 2650.0 288.3 4545049 2 622.5 2599.1 391.0 669488 3 948.4 2965.2 924.4 5974834 4 1084.6 2711.2 262.1 2776221
这是美国各州各种犯罪行为的发生率(每10万人口)。
我们把robbery和aggravated_assault的犯罪率分别分成12个区间,每个区间的犯罪率各为60次。让我们看看各区间出现的次数。(也就是0-60这一犯罪率区间出现几次,61-120出现几次等等)
直方图: ax.hist(x,bins=num_of_bins) --- x为变量,bins为柱子数量
代码如下:
import numpy as np import pandas as pd from matplotlib import pyplot as plt crime=pd.read_csv(r"http://datasets.flowingdata.com/crimeRatesByState2005.csv") fig,ax=plt.subplots() ax.hist(crime["robbery"],bins=12,histtype="stepfilled",alpha=0.6,label="robbery") ax.hist(crime["aggravated_assault"],bins=12,histtype="stepfilled",alpha=0.6,label="aggravated_assault") ax.legend() ax.set_xticks(np.arange(0,721,60)) ax.set_xlim(0,720) ax.set_yticks(np.arange(0,21,4)) plt.show()
图像如下:
可以看出,robbery在60-120犯罪率这一区间出现次数最多,而aggravated_assault在120-180犯罪率这一区间出现次数最多。
此外,直方图也可以被归一化以显示“相对”频率,在命令里加上参数normed=True即可。这样,y轴就变成了相对频率(频率=频次/样本总数;相对频率=频率/组距)。
显示相对频率的图像如下:
下面我们自己创建一组符合正态分布的数据,再用matplotlib画画看。
import numpy as np from matplotlib import pyplot as plt fig,ax=plt.subplots() np.random.seed(4) #设置随机数种子 Gaussian=np.random.normal(0,1,1000) #创建一组平均数为0,标准差为1,总个数为1000的符合标准正态分布的数据 ax.hist(Gaussian,bins=25,histtype="stepfilled",normed=True,alpha=0.6) plt.show()
图像如下:
此时,图像反映的是其概率密度,直方图的面积总和为1。
除了频次直方图,我们还可以用KDE(kernel density estimation)获取变量分布的平滑估计。具体请见下一篇:Matplotlib学习---用seaborn画直方图/核密度图(histogram, kdeplot)。