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

一、引言

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

    【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将不同性别的直方图绘制到一张图内,结果如下:

图片

好了,本篇内容就总结分享到这里,需要源码的小伙伴可以关注底部公众号添加作者微信

作者简介:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/259030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端的薪资怎么样?

前端开发工程师其实包括了很多,web端、移动端等都属于前端开发。所以无论是互联网、电商、教育,还是医疗、金融、社交等行业,前端都是必不可缺的,只是由于经济的不景气无形中拔高了前端开发的准入门槛。 前端开发的工作内容不仅仅…

多维时序 | MATLAB实现SSA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现SSA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-LST…

如何在公网环境下使用Potplayer访问本地群晖webdav中的影视资源

文章目录 本教程解决的问题是:按照本教程方法操作后,达到的效果是:1 使用环境要求:2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透,映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

@德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?

德人合科技 | 天锐绿盾加密软件是一款全面保障企业电脑数据和安全使用的加密软件 PC端访问地址:www.drhchina.com 它的功能包括但不限于: 实时操作日志:可以实时详细地记录所有终端的操作日志,包括终端上窗口标题的变换、程序的…

JS面试题

JavaScript 面试题汇总 1. 根据下面 ES6 构造函数的书写方式,要求写出 ES5 的 class Example { constructor(name) { this.name name;}init() { const fun () > { console.log(this.name) }fun(); } } const e new Example(Hello); e.init();参考答案&…

位操作符详解(C语言)

前言 C语言中的位操作符是用来对数据的二进制表示进行位级操作的运算符。这些操作符包括位与(&)、位或(|)、位异或(^)、位取反(~),这些位操作符可以用来进行各种位级…

家里就一台电脑还抢着用,限定电脑投屏解决了问题。

很多人都遇到过家里电子设备争抢的情况吧。上周我就因为临时任务,需要用电脑处理一些文件,搜索、浏览资料,制作对应PPT,无论哪项都需要用电脑。恰巧,家里小孩有个观看《大国崛起》纪录片的学习任务,带完整字…

C++继承与派生——(1)继承的层次关系

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 再好的种子,不播种下去&am…

摄像头画面作为电脑桌面背景

1. 创建文件main.pyw,文件内容 import base64 import io import os import threading import tkinter as tkimport cv2 import pystray import win32api import win32con import win32gui from PIL import Image, ImageTk from pystray import MenuItem, Menuclass…

Kubernetes 架构原则和对象设计

什么是 Kubernetes Kubernetes 是谷歌开源的容器集群管理系统 • 基于容器的应用部署、维护和滚动升级; • 负载均衡和服务发现; • 跨机器和跨地区的集群调度; • 自动伸缩; • 无状态服务和有状态服务; • 插件机制…

多表插入操作——后端

场景:当添加一个菜品时,还需要记录菜品的口味信息,因此需要对菜品表(dish)和口味表(dish_flavor)同时进行插入操作。 两个表的字段: 代码思路:由DishController将前端的…

多个文件保存路径不同,如何批量改为相同的文件名称并添加编号

大伙在日常工作中有没有遇到需要修改文件名称吗?平时遇到修改文件名称是如何操作呢,是按比较重统的方法操作,点右键重命名,这个方法是可以使用,如果量少情况可以使用这个方法操作,如果量大,文件…

防火墙-iptables详解

前言:最近的工作中,需要对防火墙进行配置,但是很多地方都是老机器,有的用iptables,有的用firewalld,我写下这篇文章,彻底地了解这两个应用软件的使用方法。在以后的工作中,相信很多人…

程序员必知!开放封闭原则的实战应用与案例分析

开放封闭原则是面向对象设计中的重要原则之一,它要求软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭。这意味着当需要添加新功能时,不应该修改现有的代码,而是应该通过扩展来实现。这可以通过使用…

Linux上随机输出谚语的程序fortune

概要: Linux上有一个随机输出谚语的程序叫fortune 手册对它的描述是:输出一个随机的、充满希望的、有趣的谚语 本篇所用的系统是Ubuntu22.04 一、fortune的安装 sudo apt install fortune-mod 二、fortune的使用 1、示例一 这个谚语是什么意思啊…

机器学习与深度学习傻傻分不清?快来!

导读:本文探讨机器学习和深度学习之间的关键区别和相互联系,目的是为大家提供一个清晰的框架,帮助大家理解这两种技术的特点、应用场景以及选择适当方法的依据。(理论辨析,无实践代码,放心食用)…

CEC2013(python):五种算法(GA、WOA、GWO、DBO、HHO)求解CEC2013(python代码)

一、五种算法简介 1、遗传算法算法GA 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、哈里斯鹰优化算法HHO 二、5种算法求解CEC2013 (1)CEC2013简介 参考文献: [1] Liang J J , Qu B Y , Suganthan P N , et al. Prob…

STM32内部是怎么工作的

STM32是怎么工作的 1 从孩子他妈说起2 早期计算机的组成2.1 五大元件(1)第一个出场的是电容元件(2)第二个出场的是二极管(3)第三个出场的是电阻元件(4)第四个出场的是电感&#xff0…

【论文简述】Learning Depth Estimation for Transparent and Mirror Surfaces(ICCV 2023)

一、论文简述 1. 第一作者:Alex Costanzino 2. 发表年份:2023 3. 发表期刊:ICCV 4. 关键词:深度感知、立体匹配、深度学习、分割、透明物体、镜子 5. 探索动机:透明或镜面(ToM)制成的材料,从建筑物的玻…

RabbitMQ入门指南(三):Java入门示例

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、AMQP协议 1.AMQP 2.Spring AMQP 二、使用Spring AMQP实现对RabbitMQ的消息收发 1.案例准备阶段 2.入门案例(无交换机) 3.任务模型案例(Work Queues&#xff0…