【科研分享】Matplotlib 绘制热力图(heatmap)进行实验结果分析

article/2025/5/14 2:09:54

Matplotlib 绘制热力图(heatmap)进行实验结果分析


写论文的时候又碰到了新的需求,为了呈现实验结果,这次需要做一个分析两个超参的图,搜了半天发现还是热力图最合适,但是在各处看了很多篇文章发现讲的要么不是太仔细,要么不太符合我的需求,于是决定投稿完事就赶紧写一篇文章记录一下,本文主要讲了一下如何使用matplotlib绘制热力图,并且给出了一些代码实验结果,分享给大家,希望能有用。

预备工作

前期环境配置

老样子,先导包:pycharm-2021.2.2, python-3.7, matplotlib-3.2.2, numpy-1.20.2 我这里就是用的早期配置的环境,顺便把自己的版本号发上来了,推测如果你用更高版本应该也没事:

import numpy as np
import matplotlib.pyplot as plt

准备数据

比如,我想要展示的是Hit Ratio @ 5这个评价指标,那么我首先需要定义一个np.array,将我想要展示的数据以矩阵的形式存进来,我在此举的例子是绘制一个5X5的热力图,所以我的输入应该是一个5x5的二维array:

HR_5 = np.array([[75.22, 76.34, 75.31, 78.03, 76.57],[80.52, 82.93, 81.33, 83.97, 83.41],[78.70, 80.41, 79.12, 82.91, 81.44],[80.04, 82.66, 81.03, 83.87, 83.28],[78.12, 79.26, 79.21, 80.14, 80.52]])

同样的,我也可以先预定义好我的x轴和y轴的显示样式:

# 坐标轴-y (行标)
tag_y = ["$α$=1", "$α$=2", "$α$=3", "$α$=4", "$α$=5"]
# 坐标轴-x (列标)
tag_x = ["$β$=1", "$β$=2", "$β$=3", "$β$=4", "$β$=5"]

这里解释一下,加$符号的意思表示取斜体,为了和我paper中的图上的斜体符号保持一致,这个写法跟Latex中要求的是一致的,第一次在pycharm里写出来的时候,我也很惊喜。

开始画图

我们就来看一种简单的情况吧,假设我们只需要画一张图(通常为了展示实验结果仅绘制一张图不可能的,但现在就假设我只给他看一种指标(即HR@5 — 一种推荐系统研究中常用的指标)):

fig, ax = plt.subplots()

接下来使用ax变量来对图进行进一步调整:

ax.set_xticks(np.arange(len(tag_x)))
# 设置x轴刻度间隔,参数为x轴刻度长度,其实也可以写作np.arange(0, 5, 1),目的就是提供5个刻度
ax.set_yticks(np.arange(len(tag_y)))
# 设置y轴刻度间隔
ax.set_xticklabels(tag_x)
# 设置x轴标签
ax.set_yticklabels(tag_y)

这里指需要注意刻度的个数必须符合我们想要绘制的热力图矩阵大小,也就是我们输入矩阵的维度。调整好了之后就可以绘制热力图了:

plt.imshow(HR_5, cmap='coolwarm', origin='upper', aspect="auto")

其中,第一个参数要传入的是我们的输入矩阵(在本例子中也就是我们准备的HR_5矩阵),它将代表要显示的格子,cmap参数表示的是你想要使用的热力图颜色风格,我这里使用了一种对比度较高的coolwarm风格,大家可以根据自己的喜好更换这个参数。origin表示的是坐标(0, 0)点的位置,如果选择"upper"则意味着,坐标开始的位置是图像的左上角,如果设置为"lower"则坐标原点在左下角(但因为我们绘制的是实验结果展示图,所以通常从左上角开始显示)。最后的参数aspect如果是‘auto’,则代表图像的长宽比将和坐标系进行自动匹配。

这里给出两个引用,第一个引用方便大家调色:

Matplotlib的imshow()函数颜色映射(cmap的取值)

第二个引用方便大家理解plt.imshow函数中各个参数的意思:

Matplotlib之plt.imshow()方法详解

然后这时候再执行:

plt.show()

就能看见我们的热力图了:
热力图雏形
然后我们为它添加热力标尺:

plt.colorbar()

带标尺的热力图
再为它添加X轴和Y轴的标签(这里额外定义了一个字体格式,为了使坐标轴标签显得不那么小):

default_font = {'family': 'Times New Roman', 'weight': 'bold', 'size': 14}
plt.xlabel('Values of the parameter $β$\n(a) HR@5 (%)\n', default_font)
plt.ylabel('Values of the parameter $α$', default_font)

注意,这几行代码必须放到plt.show()前面才会生效。
问题图片1
这时候我们发现有个问题,下面的坐标轴描述没有显示全,所以我们回到前面去调整图像的大小和边距:

fig, ax = plt.subplots(1, 1, figsize=(5, 5), dpi=300)
plt.subplots_adjust(top=0.98, bottom=0.15, left=0.15, right=0.99, hspace=0,wspace=0)

这里解释一下,第一行我们在subplots()里加的参数:前两个参数表示我们目前子图就一个(1行1列),第二个参数figsize表示所绘画布的大小5*5, dpi参数越高则图像放大后失真程度越小。
而第二行代码,则是对话不得边距进行调整,top越接近于1则图像整体越靠近顶部,bottom越接近于0,则图像整体越接近于底部,left和right也遵循相似的原则,我们经过上述两行代码可以得到下面这个样子:
调整好的图
这已经非常接近我们想要的结果了,在此基础上还可以给图像增加额外的修饰,如果你想的话。所以,我再次给出一些你可能感兴趣的修改方案:
1.增加标题

plt.subplots_adjust(top=0.94, bottom=0.15, left=0.15, right=0.99, hspace=0,wspace=0)
# 由于增加了标题导致重新调整了一下上边距为0.94
ax.set_title("Fig. 1: Happer-parameter test of $α$ and $β$ on A dataset.")

添加标题
2. 增加文字嵌入

for i in range(len(tag_y)):for j in range(len(tag_x)):text = ax.text(j, i, HR_5[i, j],ha="center", va="center", color="black", fontweight="bold")

其中,j,i:表示坐标位置上的值,参数ha有三个值可选:right、center和left,分别对应着不同的对齐方式。而va有四个值可以选择:‘top’、 ‘bottom’、 'center’和 ‘baseline’,而参数color则代表设置颜色,fontweight代表字体形式。注意这块代码需要放在plt.imshow()函数之前,才可以得到如下结果:
嵌入
3. 以一定角度翻转x轴刻度

plt.subplots_adjust(top=0.94, bottom=0.22, left=0.15, right=0.99, hspace=0,wspace=0)
# 由于偏转x轴刻度会导致垂直空间上更多地占用,所以重新调整了下边距为0.22
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

注意,这行代码需要放在设置刻度的代码之后,才能得到如下结果:
成品图

完整代码

随后,附上全部源代码:

# @Author: Jinyu Zhang
# @Time: 2022/4/30 15:07
# @E-mail: JinyuZ1996@outlook.com
import numpy as np
import matplotlib
import matplotlib.pyplot as pltdefault_font = {'family': 'Times New Roman', 'weight': 'bold', 'size': 14}
tag_y = ["$α$=1", "$α$=2", "$α$=3", "$α$=4", "$α$=5"]
tag_x = ["$β$=1", "$β$=2", "$β$=3", "$β$=4", "$β$=5"]HR_5 = np.array([[75.22, 76.34, 75.31, 78.03, 76.57],[80.52, 82.93, 81.33, 83.97, 83.41],[78.70, 80.41, 79.12, 82.91, 81.44],[80.04, 82.66, 81.03, 83.87, 83.28],[78.12, 79.26, 79.21, 80.14, 80.52]])fig, ax = plt.subplots(1, 1, figsize=(5, 5), dpi=300)
plt.subplots_adjust(top=0.94, bottom=0.22, left=0.15, right=0.99, hspace=0,wspace=0)ax.set_xticks(np.arange(0, 5, 1))
ax.set_yticks(np.arange(len(tag_y)))
ax.set_xticklabels(tag_x)
ax.set_yticklabels(tag_y)
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",rotation_mode="anchor")for i in range(len(tag_y)):for j in range(len(tag_x)):text = ax.text(j, i, HR_5[i, j],ha="center", va="center", color="black", fontweight="bold")plt.imshow(HR_5, cmap='coolwarm', origin='upper', aspect="auto")
plt.colorbar()
plt.xlabel('Values of the parameter $β$\n(a) HR@5 (%)\n', default_font)
plt.ylabel('Values of the parameter $α$', default_font)
ax.set_title("Fig. 1: Happer-parameter test of $α$ and $β$ on A dataset.", default_font)plt.show()

更多

本文只讲述了简单的绘制一幅热力图的情况,但假设我想绘制多个评价指标的热力图,该怎么办呢?可以参考我先前的一篇文章来设置多子图实验展示,其实原理很简单,就是将subplot里的参数进行修改,然后再分别对每一个子图准备数据,然后画出来就可以了,参考链接如下:

【科研分享】Matplotlib 绘制多子图(subplot)进行实验结果分析

Reference

在学习热力图绘制过程中以及本文的撰写中,都参考了很多前辈的文章,在此给出引用,站在巨人的肩膀上学习:

使用 matplotlib 绘制热力图 by mr_songw

matplotlib绘制热力图 by jin_tmac

matplotlib绘制热力图,并显示数值 by 苏里


http://chatgpt.dhexx.cn/article/Gw2sjslQ.shtml

相关文章

实验结果分析

为了说明本文所提出基于深度学习的SIR模型方法的性能,我们比较了闭集合(Close-set Dataset)数据和开集合(Open-set Dataset)数据两种情景下的已确诊Covid19病例的数量的预测值。模型的闭集合数据内拟合是模型估计潜在参数的有效性的重要指标,而开集合数据…

主成分分析在SPSS上的实现与结果分析——基于SPSS实验报告

实验目的 通过本次实验学习主成分分析在SPSS软件中的具体操作方法,更深入了解主成分分析法的基本思想,通过SPSS的实现将理论运用于实践当中,增强我们的动手能力并且会运用主成分分析的方法来处理数据实现我们的需求。 实验步骤及过程&#x…

03 数字图像技术——频域滤波实验结果与分析——python

04 数字图像技术——图像特征提取之实验结果与分析 03 数字图像技术——频域滤波实验结果与分析 02 数字图像技术——颜色空间转换与颜色空间分割实验结果与分析 01 数字图像基本操作——图像采样、量化、算术运算、点运算实验结果及分析 一、实验目的 1.了解图像…

将两张图片合并成一个PDF,不收费

如何来实现将两张图片合并成一个PDF? 我试过WPS金山、Adobe、万兴等等PDF软件,他们NND都是要收费! 咱也不是钱多到大水飘过来的,这里给出最简单的方式,用Windows自带的打印功能,就能实现! 最重要的是&…

pdf转高清图片

很多人在java中遇到ppt/pdf转图片的时候,有些插图图片转不了或者是转出来的图片不清晰,也都是使用的官方jar包。有些是需要引用到icepdf插件的,这里不细说了,直接放一段稍微简单一点的代码供参考: package test;impor…

锐化pdf文件(图片形式)

目录 前言 正文 1、使用PDF Shaper Pro拆分pdf 2、使用ComicEnhancerPro处理拆分好的图片 3、使用PDF Shaper Pro合并图片为pdf 前言 最近复习考研数学,然后买书真的是死贵死贵,第一次把网上找到的pdf打印出来后发现非常的不清晰,然后开…

利用C#实现Pdf转图片

这周碰到一个需求,由于公司系统框架的原因,不能直接显示第三方回传回来的pdf(说明一下,第三方回传的pdf是带上了签章信息(即在pdf中加入了签名图片)),需要把pdf转成图片进行显示,但在做的过程中踩了不少雷。最后使用第…

7个值得拥有收藏的免费在线 PDF转图片转换器

PDF 格式在文档演示和交换中无处不在。但是PDF转图片的必要性也在于很多情况。这里我想提几点。 收件人可能没有打开您发送的 PDF 的应用程序,但可以使用系统提供的程序查看图像。图像在浏览器中的显示速度比 PDF 快,因为图像可以流式传输,但…

图片批量合成PDF方法

目录 方法:操作多图合成一个PDF图片文件夹合成PDF批量对每个文件夹中图片合成PDF 如何获取软件 方法: 下载FreePic2Pdf软件,按下面方法操作 操作 多图合成一个PDF 打开FreePic2Pdf.exe软件点击下图1,选择图片添加进来点击下图…

android中pdf转换成图片格式,Android-PDF转图片

场景 将PDF里面的内容渲染到原生的View上面,一直没接触过这部分的技术,所以在网上寻找了下,终于发现了Android原生自带的类,也是今天我们着重讲的内容。 PdfRenderer 从名字上可以看出,这个是和渲染有关系的类型。这里…

Qt 导出pdf文件(表格、图片)

1.需要用的类 pro文件添加 QT printsupport QPdfWriter:写pdf的类 QTextDocument:支持html表格、图片的类 2.需要打印的界面 这里示例打印两个表格,一个水平方向的,一个垂直方向的,加一张图片。 3.保存的pdf效果…

将图片型pdf转成可选中文字型pdf(免费)

在使用pdf过程中我们会遇到有些pdf不能进行标注的问题,这是由于有些pdf是扫描版的, 整个pdf是由一张张图片构成的,这样的pdf是不能选中文字,所以也无法进行标注。 本教程教你如何免费将图片型pdf转成可选中文字型pdf。土豪免入~~利…

怎么把图片变成PDF

在日常办公中,如果我们需要传输图片的话一般是比较简单的,但是如果需要传输很多张图片,不管是发送还是接收的话一张张的处理就比较麻烦了。这种情况下很多朋友或许都会将图片制作成PDF文件。这样技能方便传输也能方便查阅。那么怎么把图片变成…

PHP 实现PDF转图片

目录 1.环境配置: 2.实现原理: 3.安装php扩展imagick 4.安装ghostscript 5.pdf转图片 1.环境配置: 2.实现原理: Php使用扩展插件imagick进行图片处理,处理pdf时使用imagick去调用ghostscript 3.安装php扩展imag…

图片PDF转word

最近需要把PDF转word,试了几个网站发现PDF是图片做成的而不是文本直接做的。 找了些国内的软件都要收费。 直接放网站:https://www.onlineocr.net/ 限制:只有50页的免费权限 使用: 1 点右上角SIGN UP 去注册一个账号&#x…

【PS】免费 使用PS批量将pdf转换成图片 pdf转图片 pdf转jpg pdf转png

将各种各样的pdf转成图片,是比较普遍的需求,不过目前的各种转换器,不是收费,就是限制转换数量,要不就是强制加水印,很烦。 这里我们使用PS打开PDF,然后使用PS的宏,一键将图片保存到…

Python提取PDF中的图片

⚡插播一条老家自产的糖心苹果,多个品种,欢迎选购!有问题随时私信我⚡: 🍎🍎来自雪域高原的馈赠——海拔2000米的大凉山高原生态糖心苹果🍎🍎https://blog.csdn.net/qq_15969343/art…

图片怎么转换成PDF,这三个方法轻松搞定!

图片转PDF是指将图片文件转换为PDF文件的过程。PDF(Portable Document Format)是一种文件格式,能够保存文本、图像、表格等多种元素。PDF文件具有跨平台性、可打印性和可搜索性等优点,因此被广泛应用在文档分享、文档存储和文档打…

图片转为pdf怎么弄?发送图片安全高效的格式

图片转为pdf怎么弄?pdf文档作为当下最火的一种文档格式之一,我们在日常生活中会经常使用到它。这种格式的文件保密性高,不易被修改。而将图片转换为pdf格式,不仅方便传输图片,而且还能最大程度保证图片的颜色不被改变。…

如何把图片转换成PDF?4种简单快捷的方法,一键将图片转PDF

分享4种图片转PDF的方法,转换速度快,而且能够保持图片画质清晰,不管是单个图片转换还是多个图片转换,都能满足你! 一、单张图片转PDF 1、照片查看器 直接使用Win10中自带的图片查看器,就能将图片转换为P…