100天精通Python(可视化篇)——第86天:matplotlib绘制不同种类炫酷热力图参数说明+代码实战

news2024/11/21 1:44:59

文章目录

  • 专栏导读
  • 一、热力图介绍
    • 1. 介绍
    • 2. 参数说明
  • 二、绘制热力图
    • 1. 普通热力图
    • 2. 添加坐标轴和标题
    • 3. 添加热力标尺
    • 4. 添加色块数值
    • 5. 修改热力图颜色
    • 6. 突出特殊数据
  • 三、应用场景
    • 1. 适用场景
    • 2. 不适用场景

专栏导读

🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)
  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等
    在这里插入图片描述
    在这里插入图片描述

一、热力图介绍

1. 介绍

  • 热力图(Heat Map)是一种基于色彩对数据集进行可视化的方法,可表现出数据空间内各点之间的相关性,从而揭示影响结果的因素的变化趋势。例如,较大的值由较深的颜色表示,较小的值由较浅的颜色表示;较大的值由偏暖的颜色表示,较小的值由较冷的颜色表示,等等。
  • 从数据结构来划分,热力图一般分为两种。第一,表格型热力图,也称色块图。它需要 2 个分类字段和 1 个数值字段,分类字段确定 x、y 轴,将图表划分为规整的矩形块。数值字段决定了矩形块的颜色。第二,非表格型热力图,或曰平滑的热力图,它需要 3 个数值字段,可绘制在平行坐标系中(2个数值字段分别确定x、y轴,1个数值字段确定着色)。

特点:热力图的最大特点就是能够穿透和揭示大量数据之间的空间关系,将复杂的结果可视化。它以色调的方式展示变量之间的关系,不同的色调对应着不同的值范围,渐变的颜色向着更多的变量、密集的空间和复杂的表现形式揭示变量之间的关系。

应用场景

  • 热力图适合用于查看总体的情况、发现异常值、显示多个变量之间的差异,以及检测它们之间是否存在任何相关性。
  • 热力图在各行业有着广泛的应用,尤其是在市场营销、数据分析及空间数据处理领域,比如用热力图可以分析航班的晚间到达率,可以分析疾病的集中地区,可以整理出某个行业的流行程度等。

2. 参数说明

Matplotlib绘制热力图的函数是imshow():

imshow(
     X, cmap=None, norm=None, aspect=None, interpolation=None,
     alpha=None, vmin=None, vmax=None, origin=None, extent=None, *,
     interpolation_stage=None, filternorm=True, filterrad=4.0,
     resample=None, url=None, data=None, **kwargs
     )

主要参数说明如下:

  1. X和Y:表示矩阵的行和列,X对应列,Y对应行。

  2. C:表示矩阵中每个元素的值,即热力图的颜色值。

  3. cmap:表示热力图的颜色映射,可以使用Matplotlib中的任意颜色映射。

  4. norm:表示归一化的方式,可以使用Matplotlib中的任意归一化方式。

  5. aspect:表示图像的长宽比。

  6. interpolation:表示插值方式,可以使用Matplotlib中的任意插值方式。

  7. alpha:表示透明度。

  8. vmin和vmax:表示颜色映射的范围。

  9. origin:表示图像的原点位置,可以是“upper”或“lower”。

  10. extent:表示图像的范围,以左下角和右上角坐标表示。

  11. filternorm和filterrad:表示滤波器的大小。

  12. resample:表示是否对图像进行重采样。

  13. ax:表示要绘制热力图的坐标轴对象。

  14. **kwargs:表示其他Matplotlib绘图函数的参数,如linewidths、edgecolors等。

二、绘制热力图

1. 普通热力图

下面我们就通过例子来讲述热力图的绘制,示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 生成学生成绩矩阵
grades = np.array([[80, 90, 70, 60, 85, 92],
                   [85, 88, 91, 69, 78, 90],
                   [75, 92, 80, 78, 86, 88],
                   [60, 70, 88, 82, 75, 90],
                   [91, 80, 75, 70, 89, 88],
                   [95, 85, 78, 80, 92, 90]])

# 绘制热力图
fig, ax = plt.subplots()
im = ax.imshow(grades)

# 显示图像
plt.show()

上面代码将一个二维数组传入到 imshow 方法中便可以绘制一个热力图,每个色块的颜色代表数据的大小,运行结果:
在这里插入图片描述

2. 添加坐标轴和标题

上面只是绘制了色块,并没有指明 x 轴 和 y 轴代表的含义,下面我们加上 x 轴和 y 轴的标签,并加上标题。示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 生成学生成绩矩阵
subjects = ['Chinese', 'Math', 'English', 'Physics', 'Chemistry', 'Biology']
grades = np.array([[80, 90, 70, 60, 85, 92],
                   [85, 88, 91, 69, 78, 90],
                   [75, 92, 80, 78, 86, 88],
                   [60, 70, 88, 82, 75, 90],
                   [91, 80, 75, 70, 89, 88],
                   [95, 85, 78, 80, 92, 90]])

# 绘制热力图
fig, ax = plt.subplots()
im = ax.imshow(grades)

# 添加坐标轴标签
ax.set_xticks(np.arange(len(subjects)))
ax.set_yticks(np.arange(len(grades)))
ax.set_xticklabels(subjects)
ax.set_yticklabels(['Student {}'.format(i+1) for i in range(len(grades))])
ax.set_xlabel('Subject')
ax.set_ylabel('Student')

# 添加图像标题
ax.set_title("Grades Heatmap")

# 显示图像
plt.show()

上面代码中,x 轴代表学生的姓名,y 轴代表学科的名称,二维数组中的数据代表某个学生的某学科的成绩,运行结果:
在这里插入图片描述

3. 添加热力标尺

上图中,我们加上了 x 轴和 y 轴代表的含义以及整个图的标题,但是现在我们还不知道不同色块所对应的数值的大小,下面我们就来加上。示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 生成学生成绩矩阵
subjects = ['Chinese', 'Math', 'English', 'Physics', 'Chemistry', 'Biology']
grades = np.array([[80, 90, 70, 60, 85, 92],
                   [85, 88, 91, 69, 78, 90],
                   [75, 92, 80, 78, 86, 88],
                   [60, 70, 88, 82, 75, 90],
                   [91, 80, 75, 70, 89, 88],
                   [95, 85, 78, 80, 92, 90]])

# 绘制热力图
fig, ax = plt.subplots()
im = ax.imshow(grades)

# 添加坐标轴标签
ax.set_xticks(np.arange(len(subjects)))
ax.set_yticks(np.arange(len(grades)))
ax.set_xticklabels(subjects)
ax.set_yticklabels(['Student {}'.format(i+1) for i in range(len(grades))])
ax.set_xlabel('Subject')
ax.set_ylabel('Student')

# 添加图像标题
ax.set_title("Grades Heatmap")

# 添加颜色条
cbar = ax.figure.colorbar(im, ax=ax)

# 显示图像
plt.show()

上面的代码中,我们通过调用 colorbar 函数来加上数值和颜色的对应规则。代码执行后得到的图形如下图所示:
在这里插入图片描述

4. 添加色块数值

上图我们便加上了颜色和数值的对应规则。接下来我们再为每个色块加上所代表的数值。例如:

import matplotlib.pyplot as plt
import numpy as np

# 生成学生成绩矩阵
subjects = ['Chinese', 'Math', 'English', 'Physics', 'Chemistry', 'Biology']
grades = np.array([[80, 90, 70, 60, 85, 92],
                   [85, 88, 91, 69, 78, 90],
                   [75, 92, 80, 78, 86, 88],
                   [60, 70, 88, 82, 75, 90],
                   [91, 80, 75, 70, 89, 88],
                   [95, 85, 78, 80, 92, 90]])

# 绘制热力图
fig, ax = plt.subplots()
im = ax.imshow(grades)

# 添加坐标轴标签
ax.set_xticks(np.arange(len(subjects)))
ax.set_yticks(np.arange(len(grades)))
ax.set_xticklabels(subjects)
ax.set_yticklabels(['Student {}'.format(i+1) for i in range(len(grades))])
ax.set_xlabel('Subject')
ax.set_ylabel('Student')

# 添加图像标题
ax.set_title("Grades Heatmap")

# 添加颜色条
cbar = ax.figure.colorbar(im, ax=ax)

# 在每个格子中添加文字标注
for i in range(len(grades)):
    for j in range(len(subjects)):
        text = ax.text(j, i, grades[i, j],
                       ha="center", va="center", color="black")

# 显示图像
plt.show()

上面的代码中,我们通过一个循环来为每个色块加上对应的数值。代码执行后得到的图形如下图所示:
在这里插入图片描述

5. 修改热力图颜色

改变热力图的颜色,只需要更改参数中的cmap即可,使用cmap可以改变图的颜色,cmap可以选择:

Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r, binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r, cividis, cividis_r, cool, cool_r, coolwarm, coolwarm_r, copper, copper_r, cubehelix, cubehelix_r, flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat, gist_heat_r, gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot, gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv, hsv_r, icefire, icefire_r, inferno, inferno_r, jet, jet_r, magma, magma_r, mako, mako_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, pink, pink_r, plasma, plasma_r, prism, prism_r, rainbow, rainbow_r, rocket, rocket_r, seismic, seismic_r, spring, spring_r, summer, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, twilight, twilight_r, twilight_shifted, twilight_shifted_r, viridis, viridis_r, vlag, vlag_r, winter, winter_r

案例代码:

import matplotlib.pyplot as plt
import numpy as np

# 生成学生成绩矩阵
subjects = ['Chinese', 'Math', 'English', 'Physics', 'Chemistry', 'Biology']
grades = np.array([[80, 90, 70, 60, 85, 92],
                   [85, 88, 91, 69, 78, 90],
                   [75, 92, 80, 78, 86, 88],
                   [60, 70, 88, 82, 75, 90],
                   [91, 80, 75, 70, 89, 88],
                   [95, 85, 78, 80, 92, 90]])

# 绘制热力图
fig, ax = plt.subplots()
im = ax.imshow(grades, cmap='YlOrRd')

# 添加坐标轴标签
ax.set_xticks(np.arange(len(subjects)))
ax.set_yticks(np.arange(len(grades)))
ax.set_xticklabels(subjects)
ax.set_yticklabels(['Student {}'.format(i+1) for i in range(len(grades))])
ax.set_xlabel('Subject')
ax.set_ylabel('Student')

# 添加图像标题
ax.set_title("Grades Heatmap")

# 添加颜色条
cbar = ax.figure.colorbar(im, ax=ax)

# 在每个格子中添加文字标注
for i in range(len(grades)):
    for j in range(len(subjects)):
        text = ax.text(j, i, grades[i, j],
                       ha="center", va="center", color="black")

# 显示图像
plt.show()

运行结果:
在这里插入图片描述

6. 突出特殊数据

下面代码中我们将圈出最高分和最低分,代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 生成学生成绩矩阵
subjects = ['Chinese', 'Math', 'English', 'Physics', 'Chemistry', 'Biology']
grades = np.array([[80, 90, 70, 60, 85, 92],
                   [85, 88, 91, 69, 78, 90],
                   [75, 92, 80, 78, 86, 88],
                   [60, 70, 88, 82, 75, 90],
                   [91, 80, 75, 70, 89, 88],
                   [95, 85, 78, 80, 92, 90]])

# 绘制热力图
fig, ax = plt.subplots()
im = ax.imshow(grades)

# 添加坐标轴标签
ax.set_xticks(np.arange(len(subjects)))
ax.set_yticks(np.arange(len(grades)))
ax.set_xticklabels(subjects)
ax.set_yticklabels(['Student {}'.format(i+1) for i in range(len(grades))])
ax.set_xlabel('Subject')
ax.set_ylabel('Student')

# 添加图像标题
ax.set_title("Grades Heatmap")

# 添加颜色条
cbar = ax.figure.colorbar(im, ax=ax)

# 在每个格子中添加文字标注
for i in range(len(grades)):
    for j in range(len(subjects)):
        text = ax.text(j, i, grades[i, j],
                       ha="center", va="center", color="black")

# 找到最高分和最低分
max_grade = np.max(grades)
min_grade = np.min(grades)

# 找到最高分和最低分对应的学科和学生
max_grade_index = np.argwhere(grades == max_grade)
min_grade_index = np.argwhere(grades == min_grade)

# 在热力图上用红色和蓝色圆圈标出最高分和最低分
for index in max_grade_index:
    ax.scatter(index[1], index[0], marker='o', s=200, c='r', edgecolors='k', linewidths=1)
for index in min_grade_index:
    ax.scatter(index[1], index[0], marker='o', s=200, c='b', edgecolors='k', linewidths=1)

# 在圆圈旁边添加文字标注
for index in max_grade_index:
    ax.text(index[1]+0.3, index[0]+0.3, max_grade, color='r', fontsize=12)
for index in min_grade_index:
    ax.text(index[1]+0.3, index[0]+0.3, min_grade, color='b', fontsize=12)

# 显示图像
plt.show()

最高分用红色圈出,最低分用蓝色圈出,运行结果:
在这里插入图片描述

三、应用场景

1. 适用场景

热力图的优势在于“空间利用率高”,可以容纳较为庞大的数据。热力图不仅有助于发现数据间的关系、找出极值,也常用于刻画数据的整体样貌,方便在数据集之间进行比较(例如将每个运动员的历年成绩都浓缩成一张热力图,再进行比较)。
如果将某行或某列设置为时间变量,热力图也可用于展示数据随时间的变化。例如,用热力图来反映一个城市一年中的温度变化,气候的冷暖走向,一目了然。

2. 不适用场景

尽管热力图能够容纳较多的数据,但反过来说,人们很难将其中的色块转换为精确的数字。因此,当需要清楚知道数值的时候,可能需要额外的标注。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何提高亚马逊卖家订单量?这些建议和技巧值得收藏

作为全球最大的电商平台之一,亚马逊拥有庞大的客户基础和丰富的销售渠道,这对于亚马逊卖家来说是一个非常宝贵的机会。但是,如何提高亚马逊卖家订单量是一个非常重要的问题。在本文中,我将分享一些提高亚马逊卖家订单量的建议和技…

【软考备战·希赛网每日一练】2023年5月8日

文章目录 一、今日成绩二、错题总结第一题第二题 三、知识查缺 题目及解析来源:2023年05月08日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 题目中存在一个 指向链表尾元素的指针,所以插入操作直接通过该指针进行后续操作即…

MySQL数据库用户管理以及数据库用户授权

一、数据库用户管理 1、新建用户 CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码]; ---------------------------------------------------------------------------------------------------------- 用户名:指定将创建的用户名 来源地址&#xff1a…

Mysql数据库管理高级操作

目录 一、克隆/复制一个表1.1 方法一1.2 方法二 二、清空表,删除表内所有数据2.1 方法一2.2 方法二2.3 drop、truncate、delete对比①.drop table name②.truncate table table_name③.delete from table_name小结: 三、创建临时的表四、用户管理4.1 新建…

Java每日一练(20230508) Excel表列名称、验证回文串、路径总和II

目录 1. Excel表列名称 🌟 2. 验证回文串 🌟 3. 路径总和 II 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. Excel表列名称 给…

启动Rabbit时出现Plugin configuration unchanged无法启动问题

文章目录 问题描述问题解决新问题 问题描述 在安装好Erlang和RabbitMQ并配置好环境变量后, 运行rabbitmq-plugins enable rabbitmq_management 命令, 出现如下问题 在启动Rabbit时出现以下内容 The folwing plugins have been configured: rabbitmq_management rabbitmq_mana…

Linux中最低调、最易让人忽视的tmp目录,原来用处那么大!

在Linux操作系统中,tmp目录是一个临时目录,用于存储临时文件。这个目录通常位于根目录下,命名为/tmp。本文将详细介绍Linux中的tmp目录,包括它的作用、权限、使用方法和安全性等方面。 作用 tmp目录用于存储临时文件,…

为什么成本管理在项目管理中很重要

成本管理是估算、分配和控制项目成本的过程。成本管理流程允许企业预测未来的开支,以减少预算超支的可能性。预计成本是在项目的规划阶段计算的,必须在工作开始前获得批准。 在执行项目计划时,会记录和跟踪费用,因此一切都在成本管…

聊一聊智能AI的未来

AI技术的快速发展让我们走进了一个智能时代,各种智能产品和服务也在迅速兴起。而小凡AI作为一家国内知名的人工智能开发公司,旨在为用户提供高质量、高效率、低成本的人工智能解决方案。 想象一下,当您需要大量进行数据处理和分析时&#xf…

IT图书翻译——痛并快乐着

作者:韩磊 整理者:韦小琪 作者简介 韩磊是AR 技术公司亮风台的产研副总裁。在此之前,他曾在大学、技术媒体和财经媒体工作,有多年的企业经营管理、社区与媒体运营经验。他与人合著有《网络媒体教程》,合译有《Beginning C# Objec…

时间复杂度

学习《代码随想录》 时间复杂度为什么要引入时间复杂度和空间复杂度?什么是时间复杂度?这个O是什么意思?时间复杂度越低越好? 内存管理什么是内存空间?(C为例)为什么总说C/C更偏向底层&#xff…

OpenCV4 学习指导2 —— 多种方式访问图像的像素值

图像像素访问 1、测试用例1.1、颜色缩减算法1.2、颜色缩减示例 2、图像矩阵的存储与访问2.1、图像的存储方式2.2、图像的访问方式2.2.1、C 指针:高效的访问方式2.2.2、迭代器:安全的访问方式2.2.3、行列索引:动态计算地址2.2.4、LUT 查询函数…

tiechui_lesson06_注册表操作

这节课主要学习注册表的相关操作,包括注册表的打开,读取,修改,删除。可以自己通过底层API手动来获取和设置注册表,也可以用微软提供的运行时函数。我的看法是底层函数用来了解原理,真正在代码中使用的时候还…

《三十岁,一切刚刚开始》读书笔记

目录 书籍简介 经典语句 书籍简介 在抖音上看到此书,顺便看了看。 《三十岁,一切刚刚开始》作者李尚龙。写给敢于探险、敢于突破自己的年轻人的进取之书。人这一生可以有无数种可能。 如果你近期特别丧,或者正处于瓶颈期间,不…

VLAN【实验】

虚拟局域网VLAN VLAN即虚拟局域网,是将一个物理的局域网在逻辑上划分成为多个广播域的技术。通过在交换机上配置VLAN,可以实现在同一个VLAN内的用户进行二层互访,而不通的VLAN间的用户被二层隔离。这样既能够隔离广播域,又能够提…

身临其境文化之旅——VR全景图片畅游世界各地文化景点

文化旅游是一种独特的旅游体验,它不仅让人们感受到异域文化的魅力,更能增进对世界的了解和认知。VR全景图片和文化旅游之间有着密不可分的关系。作为一种数字化技术,VR全景图片可以为文化旅游提供更加深入、真实、立体的体验。随着VR技术的发…

品牌宣传软文发布,多久一次合适?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 品牌宣传有许多手段,线下活动,电视广告,讲座,招商等手段,其中软文发布是性价比较高的一种方式,那么软文宣传多久一…

神奇,声网Web SDK还能这么实现直播中美颜功能

前言 本篇文章是通过使用声网Web SDK来实现直播中美颜效果的深度体验文章,其中发现了屏幕共享并本地合图多个视频、图片,声网美颜插件等功能特性十分强大和专业,特为此做一个技术体验的分享,毕竟好技术就是要去传播的。 随着音视…

深入了解Facebook广告工具和资源,优化你的营销活动

作为企业主或营销人员,利用Facebook的广告工具和资源,可以帮助你更好地推广品牌、吸引潜在客户,并提升销售业绩。在本文中,我们将深入了解Facebook的广告工具和资源,帮助你优化营销活动,实现更好的效果。 1…

Ubuntu多卡服务器、普通用户安装paddlepaddle环境

Ubuntu多卡服务器、普通用户安装paddlepaddle环境 1. 建立conda虚拟环境2. 安装paddlepaddle gpu版本2.1 选择cuda版本2.2 安装paddle 3. 验证及排错3.1 验证方法3.2 第一次报错:cuda问题3.3 第二次报错:NCCL问题(多卡) 4. 设置环…