博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Matplotlib学习---用matplotlib画直方图/密度图(histogram, density plot)
阅读量:5823 次
发布时间:2019-06-18

本文共 2192 字,大约阅读时间需要 7 分钟。

直方图用于展示数据的分布情况,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 npimport pandas as pdfrom matplotlib import pyplot as pltcrime=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 npfrom matplotlib import pyplot as pltfig,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)获取变量分布的平滑估计。具体请见下一篇:

 

转载于:https://www.cnblogs.com/HuZihu/p/9419333.html

你可能感兴趣的文章
Java I/O操作
查看>>
Tomcat性能调优
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
灰度图像和彩色图像
查看>>
FreeMarker-Built-ins for strings
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
spring-boot支持websocket
查看>>
菜鸟笔记(一) - Java常见的乱码问题
查看>>
我理想中的前端工作流
查看>>
记一次Git异常操作:将多个repository合并到同一repository的同一分支
查看>>
Chrome 广告屏蔽功能不影响浏览器性能
查看>>
Android状态栏实现沉浸式模式
查看>>
使用Openfiler搭建ISCSI网络存储
查看>>
学生名单
查看>>
(转) 多模态机器翻译
查看>>
【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
查看>>
矩阵常用归一化
查看>>
Oracle常用函数总结
查看>>
【聚能聊有奖话题】Boring隧道掘进机完成首段挖掘,离未来交通还有多远?
查看>>