百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

【Python可视化系列】一文教会你绘制美观的直方图(理论+源码)

off999 2024-10-27 11:47 28 浏览 0 评论

一、引言

前面我详细介绍了如何绘制漂亮的折线图和柱状图:

【Python可视化系列】一文彻底教会你绘制美观的折线图(理论+源码)

【Python可视化系列】一文教会你绘制美观的柱状图(理论+源码)

对于一个连续性的变量,进行分布可视化最基本的图形是直方图(频度图)。每一个直方图进行可视化的时候都是分成两步的:(i) 把数据进行分组,首先把连续性的按照一定的范围进行分组,然后再统计这个范围的人数。(ii) 对上面分组的数据可视化,主要是通过类似条形图的方式来展示出来。

我将持续更新可视化的一些方法,关注我,不错过!本文将详细解读绘制直方图的要点!

二、实现过程

2.1 plt.hist()函数参数详解

函数功能:判定数据(或特征)的分布情况
调用方法:plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False)
参数说明:
x:指定要绘制直方图的数据;
bins:指定直方图条形的个数;
range:指定直方图数据的上下界,默认包含绘图数据的最大值和最小值;
density:是否将直方图的频数转换成频率;
weights:该参数可为每一个数据点设置权重;
cumulative:是否需要计算累计频数或频率;
bottom:可以为直方图的每个条形添加基准线,默认为0;
histtype:指定直方图的类型,默认为bar,除此还有’barstacked’, ‘step’, ‘stepfilled’;
align:设置条形边界值的对其方式,默认为mid,除此还有’left’和’right’;
orientation:设置直方图的摆放方向,默认为垂直方向;
rwidth:设置直方图条形宽度的百分比;
log:是否需要对绘图数据进行log变换;
color:设置直方图的填充色;
label:设置直方图的标签,可通过legend展示其图例;
stacked:当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放;

我们可以使用直方图来展现数据的分布,同过图形的长相,可以快速的判断数据是否近似服从正态分布。之所以我们很关心数据的分布,是因为在统计学中,很多假设条件都会包括正态分布,故使用直方图来定性的判定数据的分布情况,尤其显得重要。

2.2 基本直方图

# 读取数据集
heart = pd.read_csv(os.path.join(base_dir, 'data', 'UCI Heart Disease Dataset.csv'))
# 检查年龄是否有缺失
any(heart.age.isnull())
# 不妨删除含有缺失年龄的观察
heart.dropna(subset=['age'], inplace=True)


# 设置图形的显示风格
plt.style.use('ggplot')
# 字体设置
config = {
    "font.family": 'Times New Roman, SimSun', # 衬线字体
    "font.size": 12, # 相当于小四大小
    "mathtext.fontset": 'stix', # matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大
    'axes.unicode_minus': False # 处理负号,即-号
}
plt.rcParams.update(config)
# 绘图:患者年龄的频数直方图
plt.hist(heart.age, # 绘图数据
        bins = 20, # 指定直方图的条形数为20个
        color = 'steelblue', # 指定填充色
        edgecolor = 'k', # 指定直方图的边界色
        label = '直方图' )# 为直方图呈现标签
plt.title('患者年龄的频数直方图')
plt.xlabel('年龄')
plt.ylabel('频数')
# 显示图例
plt.legend()
# 显示图形
plt.show()

将数据中年龄切成20份,并计算每份患者的人数,得到如下直方图:

2.3 累计频率直方图

# 绘图:年龄的累计频率直方图
plt.hist(heart.age, # 绘图数据
        bins = np.arange(heart.age.min(),heart.age.max(),5), # 指定直方图的组距
        density = True, # 设置为频率直方图
        cumulative = True, # 积累直方图
        color = 'steelblue', # 指定填充色
        edgecolor = 'k', # 指定直方图的边界色
        label = '直方图' )# 为直方图呈现标签


# 设置坐标轴标签和标题
plt.title('患者年龄的频率累计直方图')
plt.xlabel('年龄')
plt.ylabel('累计频率')
# 显示图例
plt.legend(loc = 'best')
# 显示图形
plt.show()

通过累计频率直方图就可以快速的发现到什么年龄段的人数占了多少比重

2.4 频率直方图和密度分布曲线图(密度图)

plt.hist(heart.age, # 绘图数据
        bins = np.arange(heart.age.min(),heart.age.max(),5), # 指定直方图的组距
        density = True, # 设置为频率直方图
        color = 'steelblue', # 指定填充色
        edgecolor = 'k') # 指定直方图的边界色


# 设置坐标轴标签和标题
plt.title('患者年龄频率直方图')
plt.xlabel('年龄')
plt.ylabel('频率')


# 生成正态曲线的数据
x1 = np.linspace(heart.age.min(), heart.age.max(), 1000)
normal = norm.pdf(x1, heart.age.mean(), heart.age.std())
# 绘制正态分布曲线
line1, = plt.plot(x1,normal,'r-', linewidth = 2)


# 生成核密度曲线的数据
kde = mlab.GaussianKDE(heart.age)
x2 = np.linspace(heart.age.min(), heart.age.max(), 1000)
# 绘制
line2, = plt.plot(x2,kde(x2),'g-', linewidth = 2)
# 显示图例
plt.legend([line1, line2],['正态分布曲线','核密度曲线'],loc='best')
# 显示图形
plt.show()

为了测试数据是否近似服从正态分布,要在直方图的基础上再绘制两条线,一条表示理论的正态分布曲线,另一条为核密度曲线,目的就是比较两条曲线的吻合度,越吻合就说明数据越近似于正态分布。

补充:

密度图是与直方图密切相关的概念,它用一条连续的曲线表示变量的分布,可以理解为直方图的”平滑版本“。统计学经典理论假设样本数据来源于总体,而总体数据会服从某个分布(如正态分布,二项式分布等)。密度图采用”核密度统计量“来估计代表总体的随机变量的概率密度函数。直方图(频度图)观察数据的趋势,密度图观察数据的分布。

2.5 堆叠直方图

# 提取不同性别的年龄数据
age_female = heart.age[heart.sex == 0]
age_male = heart.age[heart.sex == 1]
# 设置直方图的组距
bins = np.arange(heart.age.min(), heart.age.max(), 2)
# 男性患者年龄直方图
plt.hist(age_male, bins = bins, label = '男性', color = 'steelblue', alpha = 0.7)
# 女性患者年龄直方图
plt.hist(age_female, bins = bins, label = '女性', alpha = 0.6)
# 设置坐标轴标签和标题
plt.title('患者年龄频数直方图')
plt.xlabel('年龄')
plt.ylabel('人数')
# 显示图例
plt.legend()
# 显示图形
plt.show()

通过两个hist将不同性别的直方图绘制到一张图内,结果如下:

好了,本篇内容就总结分享到这里,需要源码的小伙伴可以关注联系我!

原文链接:

【Python可视化系列】一文教会你绘制美观的直方图(理论+源码)

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。

相关推荐

大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍

“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...

电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器

在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...

设置了加密密码zip文件要如何打开?这几个方法可以试试~

Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...

大文件想要传输成功,怎么把ZIP文件分卷压缩

不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...

高效处理 RAR 分卷压缩包:合并解压操作全攻略

在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...

2个方法教你如何删除ZIP压缩包密码

zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...

速转!漏洞预警丨压缩软件Winrar目录穿越漏洞

WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...

文件解压方法和工具分享_文件解压工具下载

压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...

[python]《Python编程快速上手:让繁琐工作自动化》学习笔记3

1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...

Python内置tarfile模块:读写 tar 归档文件详解

一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...

使用python展开tar包_python拓展

类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...

银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留

近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...

ZIP文件怎么打开?2个简单方法教你轻松搞定!

在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...

Ubuntu—解压多个zip压缩文件.zip .z01 .z02

方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...

如何使用7-Zip对文件进行加密压缩

7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...

取消回复欢迎 发表评论: