Python——比 Seaborn 更好的相关性热力图:Biokit Corrplot

目录
  • 前言:我们需要更好的相关性热力图
  • 对比 Python Seaborn 与 R corrplot
    • 传统的 Seaborn 相关性热力图
    • R 语言中的相关性热力图
  • 关于 Biokit
    • 简介
    • 库的安装
    • 相关性热图的绘制
      • 基本使用方法
      • 详述一些绘图参数的问题及细节
        • 关于 order_method 参数
        • 关于 order_metric 参数
        • 关于 cmap 参数
  • 改进 BioKit 中 Corrplot 对 colormap 的支持
    • 事情的起因
    • 拉取 Biokit 源码并在本地构建
  • 总结和补充

前言:我们需要更好的相关性热力图

在 Python 中我们日常分析数据的过程当中经常需要对数据进行相关性分析,相关性热力图(Correlation Heatmap)是我们经常使用的一种工具。通过相关性热力图,我们可以通过为相关性不同的数据使用不同深浅的不同颜色进行标记,从而直观地观察两两数据序列之间的相关性情况——这将有助于我们进一步的数据分析和处理,比如数据的回归分析等。

这其中最常见的工具就是由 Seaborn 工具包提供的 sns.heatmap(),处理方法的原理相当于先取得变量序列的相关性矩阵,然后直接对相关性矩阵绘制矩阵热图。

然而最近在学习了 R 语言之后,使用 corrplot 包可以绘制出更加华丽、全面、直观的相关性图,相比较之下就觉得 Seaborn 提供的热图并不令人满意。因此本文介绍一种新的更好的相关图的绘制方法,来自 Biokit 工具包中的 biokit.viz.Corrplot() 类,并介绍其使用。

废话不多说,先上图展示:

image

  • (咱就说我们平时写论文或者分析报告的时候,把这个图往上面一放是不是高端大气上档次?)

对比 Python Seaborn 与 R corrplot

传统的 Seaborn 相关性热力图

下面展示了一个简单的使用示例:

# 导入需要用到的库
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns# 读取数据,这里以著名的波士顿数据集举例
data = pd.read_csv('./data/boston.csv')# 绘制热图
fig, ax = plt.subplots(figsize=(10, 8))
sns.heatmap(data.corr(), annot=True, cmap='coolwarm', ax=ax)fig.savefig('../image/py_heatmap.png')

上述的代码绘制效果如下图所示:

image

从上图中可以看出传统的 Seaborn 的热图存在一些问题:

  1. 各个字段按顺序输出,不同相关性的单元格混排,难以一眼看出变量之间的显著相关关系
  2. 即使选择了对比度更高的,Colormap 仍然难以一眼找到具有较高相关性的变量
  3. 三角图的绘制需要设置和使用 mask 参数,代码书写复杂度瞬间翻倍

R 语言中的相关性热力图

相比较之下,如下是通过 R 语言绘制的相关性热图的示例:

### 导入工具包 ###library('corrplot')### 读取数据 ###
dat <- read.csv('./data/boston.csv')### 计算取得相关性及相关性显著性 ###
corr <- cor(dat)
corrl <- cor.mtest(dat)### 绘图 ###
corrplot.mixed(corr, order = 'AOE',lower = 'number', upper = 'ellipse',p.mat = corrl$p, insig = 'pch', pch = 4,tl.col = 'black', tl.pos = 'lt',number.cex = 0.7,  # 调整数字大小
)

关于 R 语言中 Corrplot 的使用方法,可以参考文章 An Introduction to corrplot Package,从原文中可以看见 R 的 Corrplot 包提供了大量自由度极高的参数选项对绘制的相关性热图进行调整。

绘制效果如下图所示:

image

从上图可以看出,与 Seaborn 相比,R 语言的相关性热力图具有以下几个显著的优势:

  1. 允许使用椭圆形、不同大小的圆或者方片乃至小饼图结合颜色标记来标记每个变量之间的相关性,更加直观、清晰。
  2. 允许数值和形状分开分别绘制在图的左下角和右上角,丰富图的内容。
  3. 对于未通过显著性检验的相关性矩阵元素,使用散点标记划去(图中的叉)。

显然我们希望在 Python 中也能像这样轻松第绘制更加美观和华丽的相关性热力图。

关于 Biokit

简介

BioKit 一套专门用于生物信息学、数据可视化(BioKit.viz)、在线生物数据访问(例如 UniProt,得益于生物服务的 NCBI)的工具。它还包含与数据分析相关的更高级的工具(例如 biokit.stats)。由于R在生物信息学中很常见,Biokit 还提供了一个方便的模块来在 Python 脚本或 shell 中运行 R(biokit.rtools 模块)。

文档手册在 biokit.readthedocs.io,详情请自行查看。

库的安装

Biokit 的安装在原生的 Python 和 Anaconda 中略有不同,按照官方给出的安装方式,在 Python 中:

pip install biokit

如果在使用 Conda,则官方手册和代码仓库的 README.md 文件中给出的安装方式互不相同。其原因……额,咱也不知道咱也不敢问:

conda install bioconda # 根据官方仓库 README.md
conda install biokit   # 根据手册

不过我会推荐大家从源码构建安装 Biokit,具体的原因我会在下文详述。

相关性热图的绘制

基本使用方法

Biokit 中的热图是以一个类的形式定义的,具体的定义形式:

biokit.viz.Corrplot(data, na=0)

这里初始化方法传入两个参数:na 是一个用于替换数据中的缺失值的默认值,也就是说如果数据里面有缺失值就会被自动替换为这个值。不言而喻;

这个 data 则很有意思,我翻译了官网上对于这个变量的介绍:

输入可以是 DataFrame(Pandas)、List(python)或 numpy 矩阵。但是,请注意,值必须介于 -1 和 1 之间。如果不是, 或者如果矩阵(或列表列表)不是方阵,则相关性为其自动计算的结果。数据或计算的相关性存储在 df 属性中。

也就是说,在 Biokit 中,传进的 data 参数可以是有待计算相关性的原始数据,也可以是相关性矩阵。如果传入前者,方法会为你计算相关性系数。

完成初始化之后,需要调用 .plot() 方法来绘图。其中,关于绘制图片的方法 biokit.viz.Corrplot.plot() 定义形式如下:

def plot(self, fig=None, grid=True, rotation=30, lower=None, upper=None, shrink=0.9, facecolor="white", colorbar=True, label_color="black", fontsize="small", edgecolor="black", method="ellipse", order_method="complete", order_metric="euclidean", cmap=None, ax=None, binarise_color=False):

详述一些绘图参数的问题及细节

对于每个参数的含义的说明,如下表所示:

名称 默认值 含义
fig None 一个 matplotlib 图对象,用于绘制热力图。默认情况下会自动创建,也可以在使用的时候具体指定。
grid True 添加网格(默认为灰色)。您可以将其设置为False或颜色。
rotation 30 在y轴上旋转标签的角度
lower None 设置左下角部分的热力图的绘制方法,可选的参数有 'ellipse''square''rectangle' 以及'color''text''circle''number''pie',绘制效果即字面意思所示,本文的读者可自行尝试每一种绘制效果。
upper None 设置右上上角部分的热力图的绘制方法,可选参数同 lower,此不复赘述。
shrink 0.9 符号使用每个小方格的最大空间(百分比)。如果提供负值,则取绝对值;如果大于 1,符号将与边框方格重叠。
facecolor "white" 图整体背景的颜色(默认为白色)。
colorbar True 添加颜色条(默认为True)。
label_color "black" 轴标签的颜色(默认为黑色)。
fontsize "small" 字体的大小,默认为“small”。可以直接用数字控制大小。
edgecolor "black" 代码文档中未曾提及但是确实存在的参数选项,目测其功能是指定绘制矩形、椭圆、圆等图形时图形边缘的颜色。。
method "ellipse" 在没有指定 lower 或者 upper 参数时生效,
order_method "complete" 使用方法对相关性矩阵的行和列重新排序,使得相似的变量被聚集在一起。这种排序可以帮助你更清晰地观察和理解数据的相关性模式。
order_metric "euclidean" 用于计算距离的度量标准。下文详述。
cmap None matplotlib 或 colormap 包中的有效的 Colormap(例如。'jet''copper')。默认为红色/白色/蓝色。
ax None 一个标准的 matplotlib 坐标轴对象。不指定则自动创建。
binarise_color False 又是一个代码文档中没说过的参数。目测其功能是将颜色值二值化(binarize)。具体来说,如果 binarise_color 被设置为 True,颜色值将被转换为二进制值。换句话说,简化颜色表示,仅使用两种颜色来表示正负相关性。

对于上表中的部分参数,我这里需要给出一些详细的说明:

我写不动了,这段内容我让 Chat 姐帮我写了。请读者们体谅一下。

关于 order_method 参数

order_method 参数决定了用于层次聚类的链接方法。这些方法定义了如何计算聚类之间的距离。常见的链接方法包括:

  • 'single': 最近邻法。两个聚类之间的距离由最近的一对点决定。
  • 'complete': 最远邻法。两个聚类之间的距离由最远的一对点决定。
  • 'average': 平均法。两个聚类之间的距离由所有点对之间的平均距离决定。
  • 'centroid': 质心法。两个聚类之间的距离由它们质心之间的距离决定。
  • 'median': 中位数法。计算两个聚类的中位数质心之间的距离。
  • 'ward': Ward法。最小化每个聚类的平方和误差。

这些方法是通过 scipy.cluster.hierarchy.linkage 函数实现的。选择不同的方法会影响聚类结果,从而影响相关性矩阵的排序。

关于 order_metric 参数

order_metric 参数决定了用于计算距离的度量标准。常见的度量标准包括:

  • 'euclidean': 欧几里得距离。
  • 'cityblock': 曼哈顿距离(城市街区距离)。
  • 'cosine': 余弦距离。
  • 'hamming': 汉明距离。
  • 'jaccard': 杰卡德距离。

这些度量标准是通过 scipy.spatial.distancescipy.cluster.hierarchy 提供的。选择不同的距离度量会影响聚类计算的结果。

在使用中,order_methodorder_metric 会对相关性矩阵的行和列重新排序,使得相似的变量被聚集在一起。这种排序可以帮助你更清晰地观察和理解数据的相关性模式。为了方便读者理解,我们这里给出一段示例代码——例如,如果你使用 'complete' 方法和 'euclidean' 距离,对应的代码如下:

Y = self.linkage(self.df, method=order_method, metric=order_metric)
ind1 = hierarchy.fcluster(Y, 0.7 * max(Y[:, 2]), "distance")
Z = hierarchy.dendrogram(Y, no_plot=True)
idx1 = Z["leaves"]
cor2 = self.df.iloc[idx1, idx1]

这段代码首先计算相关性矩阵的层次聚类,然后根据聚类结果对矩阵的行和列进行重新排序。self.linkage 函数调用了 scipy.cluster.hierarchy.linkagehierarchy.fclusterhierarchy.dendrogram 分别用于获取聚类结果和绘制树状图。

关于 cmap 参数

Biokit 源代码中应用 camp 参数的方法是:

self.cm = cmap_builder(cmap)

所以你可以使用如下的指定 colormap 的方法:

  • 指定 colormap 的名称:cmap='viridis'
  • 指定三种具体颜色的过渡:cmap=['#2F7FC1', '#FFFFFF', '#D8383A']

⚠ ⚠ ⚠ 不要使用 如下的方法指定 colormap,否则将会报错:

# 不要这样做!
import matplotlib.pyplot as plt
fromcmap = plt.cm.get_cmap('inferno') # 获取cmap对象
data = ...... # 中间代码略corrp = Corrplot(data)
corrp.plot(cmap=cmap
)

改进 BioKit 中 Corrplot 对 colormap 的支持

事情的起因

回到本文最开头的那张图片,绘制这张图片我使用了如下的代码:

import pandas as pd
import matplotlib.pyplot as pltfrom biokit.viz import Corrplotdata = pd.read_csv('./data/boston.csv')fig, ax = plt.subplots(figsize=(10, 8))
datacorr = Corrplot(data)
datacorr.plot(ax=ax,lower='ellipse', upper='text', cmap='YlGnBu_r', edgecolor='grey', fontsize=12, order_method='centroid')

如果读者们运行我给出的这段代码,就会发现图片绘制出来的效果和本文中所展示的有所不同——为什么右上半个三角中的数字只有红蓝两种颜色,而本文中展示的绘制效果则是叠加了 viridis Colormap 的效果呢?

实际上,原生的 Biokit 中 Corrplot 在使用 method='number' 的时候确实不支持任意 Colormap,只支持红蓝双色。参考 Biokit 在 Github 上的源代码仓库 biokit/biokit 中的 Jupyter Notebook biokit/viz/corrplot 中的说明:

c.plot(method='text', fontsize=8, colorbar=False)
# only red to blue colormap is implemented so far

image

但是仔细查看源代码之后,我发现想要修复这个问题使 .plot(method='text') 支持 Colormap 其实很简单。参考 stackoverflow 上的提问 Getting individual colors from a color map in matplotlib,我发现 matplotlib 中有个 Normalize 类能够将 colormap 对象映射到任何数值范围内:

matplotlib.colors.Normalize(vmin=vmin, vmax=vmax)

我们知道相关性是一个从 -1 到 1 之间的数值,因此只需要将用户指定的 Colormap 映射到这个区间范围,再根据每个相关性矩阵元素的值从标准化之后的 Colormap 中选取颜色就好了。具体的实现方法:

Biokit 中原始的这段代码为:

...elif method in ['number', 'text']:from easydev import precisionif d<0:edgecolor = 'red'elif d>=0:edgecolor = 'blue'ax.text(x,y, precision(d, 2), color=edgecolor,fontsize=self.fontsize, horizontalalignment='center',weight='bold', alpha=max(0.5, d_abs))# withdash=False)
...

我给修改成了:

...elif method in ['number', 'text']:from easydev import precision# if d<0:#     edgecolor = 'blue'# elif d>=0:#     edgecolor = 'red'# Instantiate a # `matplotlib.colors.Normalize()` object# as `color_norm`color_norm = Normalize(# the range of correlation coefficientvmin=-1.0, vmax=1.0)# select colors for each `d` # with normalized colormapedgecolor = self.cm(color_norm(d))# plot the label with the colorax.text(x,y, precision(d, 2), color=edgecolor,fontsize=self.fontsize, horizontalalignment='center',weight='bold', # alpha=max(0.5, d_abs) # withdash=False)) # alpha is no longer needed
...

我当时觉得这个改动还蛮好的,所以大概是在这篇博客写完之前的上个星期,我向原仓库提交了 Feature: A Method to Apply colormap to corrplot while Using method='number' #78,结果原作者一直不回复我。后来我干脆自己动手,又提交了 Pull Request for Issue #78: Apply Colormap to Corrplot #79。后来我看了一下 Biokit 仓库现在的情况——好家伙,上次更新都已经是 3 年前了,不知道为什么这个仓库自那之后便一直没有再更新过。

所以读者们如果想要使用像本文开头所展示的那样带颜色的 text Corrplot,可以从 Github 上拉取 我 fork 并修改过源码的 repo,然后在本地通过源码构建安装。

拉取 Biokit 源码并在本地构建

如果您的计算机环境上已经配置过 Git 工具则可以使用下面的命令拉取项目到本地:

git clone https://github.com/GitHubonline1396529/biokit.git

进入本地项目文件夹并构建安装源码:

cd ./biokit
pip install .

注意!不要再使用 python -u ./setup.py 了! 这种安装方式已经严重过时,被弃用了。(居然到现在为止 CSDN 上还有那么多博文在建议这样构建源码,每天都有一大堆新手跑过来问我。我还能说什么?)

总结和补充

Biokit 是一个功能强大的库,尽管本文仅介绍其热力图的绘制,但是实际上这个工具包的功能非常的多,有待读者们发现。但是中文互联网上对于 Biokit 的介绍很少,我直接通过 Bing 搜索找到的也只有腾讯云社区上的 BioKit!让你用Python也可以轻松绘制矩阵热力图... 这一篇。

不知道原项目后面会不会更新,但是这么好的项目沉了也是蛮可惜的。但是凭我自学 Python 两年半的功夫肯定是更新不动这么大的一个项目的。

我也相当于是在这里问问有没有人愿意提供帮助吧。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流量治理核心策略

熔断、隔离、重试、降级、超时、限流https://mp.weixin.qq.com/s/_3pht6cFdkuRfrE1z0dpKQ

第三次blog大作业

1,前言:最后两次大作业都是只有一道题,就是前面的家庭电路模拟题的迭代,题目量虽然看起来很少只有一道题目,但是这一道题目也比前面出几道题目的时候花的时间还要长,第七次大作业的迭代主要考虑的是单刀双置开光,单刀双置开关为了避免短路,他连接不同的电路还会有不同的…

PTA题目集7~8的总结性Blog

前言: 对于我这种水平的学生来说本次的7-8次PTA的难度之大令我无从下手,况且之前的第6次PTA就已经让我望而止步了,更别提这两次在第6次PTA题目集之上再次进行迭代的题目了。再加上面临的期末周,大量学科等着我去复习,以至于没时间去钻磨PTA的改动,哭死,连老师都说单单是…

如何刻画复杂事件

用简单的基本事件来刻画复杂事件前言 复杂事件的刻画 ✍️[网摘整理]设 \(A\),\(B\) 是试验 \(E\) 的随机事件,深入体会用基本事件的和或积的运算来刻画复杂事件,并熟练掌握: ① \(A\)发生:\(A=AB+A\bar{B}\); ② 只有 \(A\) 发生:\(A\bar{B}\); ③ \(A\),\(B\) 恰有一…

VS2022 csproject文件增加发布时文件项

发布时新加的node_modules 总是不会伴随着其他文件一起发布到文件夹里面。一个一个添加选项太麻烦了。百度查询后发现可以通过修改csproject 把node_modules //添加节点即可 <ItemGroup> <Content Include="wwwroot\assets\node_modules\**"> <C…

【OHSAS 18001标准制定方】

OHSAS 18001标准的制定方是多个国际标准机构和专业组织合作的结果。这一标准是在1999年由英国标准协会(British Standards Institution, BSI)联合全球多个标准制定机构、认证机构与专业组织共同发展的。OHSAS 18001标准的制定考虑了与ISO 9001(质量管理体系)和ISO 14001(环…

Django - admin list_filter 自定义过滤器

from django.contrib import admin from django.contrib.admin import SimpleListFilterclass MyStatusFilter(SimpleListFilter):# 设置过滤标题title = "订单状态"# 设置自定义过滤字段parameter_name = status2# 显示筛选条件def lookups(self, request, model_ad…

DST Server搭建

DST Server(饥荒服务器搭建)方法介绍 论坛上的方法我看了试过了,然后我分析了他这个运行脚本以及偷懒去直接挪用了客户端创建的本地世界存档。这个文档之前在B的专栏上写过,但是切换编辑器新旧版的时候内容直接删除了。 涉及的目录和文件有: /home/lion/.local/share/Steam/…

.net6 prism wpf 使用halcon导出函数

1、halcon导出函数read_image(Image, 1.png) get_image_size (Image, Width, Height) dev_open_window (0, 0, Width-500, Height-500, black, WindowHandle) dev_display (Image) 2、使用导出的C#代码 4、修改导出的 cs程序1、HObject修改为公开属性2、封装Dispose函数 5、wp…

喜报 | 极限科技获得北京市“创新型”中小企业资格认证

2024年6月20日,北京市经济和信息化局正式发布《关于对2024年度4月份北京市创新型中小企业名单进行公告的通知》,极限数据(北京)科技有限公司凭借其出色的创新能力和卓越的企业实力,成功获得“北京市创新型中小企业”的殊荣。北京市“创新型中小企业”的殊荣,是对极限数据…

【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练

一、介绍 乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器(迪吉里杜管, 铃鼓, 木琴, 手风琴, 阿尔卑斯号角, 风笛, 班卓琴, 邦戈鼓, 卡萨巴, 响板, 单簧管, 古钢琴, 手风琴(六角形), 鼓, 扬琴, 长笛, 刮…

简书屏蔽Firefox,无法访问jianshu.io 图片

最近使用Firefox 访问简书时发现,简书页面中的图片均无法显示(事发时是在2024年六月份)。 通过查看Firefox“开发者工具”(“工具”-> "浏览器工具"->"web开发者工具")的Console和Network发现很多403错误,这些错误均是在访问jianshu.io时出现(…

Revel:Go语言中比Gin更好用的Web框架

Revel:Go语言中比Gin更好用的Web框架 原创 K8sCat 源自开发者 2024-05-28 23:54 广东 2人听过源自开发者 专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。 259篇原创内容公众号在众多的Golang Web框架中,Revel以其全栈特性脱…

Maven下载、安装与配置

Maven下载、安装与配置下载 Maven 1、进入 Maven官方下载地址 2、点击 Download,再点击 Maven 3 archives,查看 3.x.x 版本的 Maven3、点击 3.9.6 文件夹(对应版本号),再点击 binaries 文件夹,点击下载 apache-maven-3.9.6-bin.zipbinaries:可执行版,是已经编译好的版本…

典型性相关分析在SPSS中的实现

典型性相关分析是研究两组变量(每组变量中都可能有多个指标)之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 本文着重模型在spss中的应用,通过一道例题解释各个指标的意义。详细推导过程请选修课程《多元统计分析》 目录一、问题提出二、利用SPSS进…

PTA7-8次作业

Blog1.前言: 第七次作业是在第六次作业基础上的拓展,新增互斥开关与受控窗帘(要求:互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均…

.net6 prism wpf 8.1使用 halcondotnet 17.12程序集

1、找到安装目录下的halcondotnet.dll 2、自己新增dlls离线程序集合文件夹 3、放入halcondotnet.dll 4、wpf程序右键引用dll 5、报错 System.Drawing.Common问题nuget安装包 System.Drawing.Common 6、wpf使用halcondotnet.dll 程序集 <UserControl x:Class="Halcon…

表格结构转换(Filter+ToRow)

问题:一维表转成二维表,重复的内容横向展开 函数公式解决:=TOROW(FILTER(B$2:C$7,A$2:A$7=E2))

VAE生成人脸代码

基于VAE介绍的理论,简单实现VAE生成人脸,代码如下: utils.pyimport os from torch.utils.data import Dataset from torchvision.transforms import transforms import glob import cv2 import numpy as np import torchclass MyDataset(Dataset):def __init__(self, img_pa…

ret2shellcode

参考链接 :基本 ROP - CTF Wiki (ctf-wiki.org) 参考链接: https://www.freebuf.com/vuls/266711.html 参考链接:PWN入门(2-2-1)-栈迁移(x86) (yuque.com)介绍栈溢出漏洞的一种利用方式,通过向可写入可执行内存写入shellcode,并利用栈溢出漏洞将返回地址覆盖为shellco…