- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
order_method
参数order_metric
参数cmap
参数在 Python 中我们日常分析数据的过程当中经常需要对数据进行相关性分析,相关性热力图(Correlation Heatmap)是我们经常使用的一种工具。通过相关性热力图,我们可以通过为相关性不同的数据使用不同深浅的不同颜色进行标记,从而直观地观察两两数据序列之间的相关性情况——这将有助于我们进一步的数据分析和处理,比如数据的回归分析等.
这其中最常见的工具就是由 Seaborn 工具包提供的 sns.heatmap(),处理方法的原理相当于先取得变量序列的相关性矩阵,然后直接对相关性矩阵绘制矩阵热图.
然而最近在学习了 R 语言之后,使用 corrplot 包可以绘制出更加华丽、全面、直观的相关性图,相比较之下就觉得 Seaborn 提供的热图并不令人满意。因此本文介绍一种新的更好的相关图的绘制方法,来自 Biokit 工具包中的 biokit.viz.Corrplot() 类,并介绍其使用.
废话不多说,先上图展示:
下面展示了一个简单的使用示例:
# 导入需要用到的库
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')
上述的代码绘制效果如下图所示:
从上图中可以看出传统的 Seaborn 的热图存在一些问题:
相比较之下,如下是通过 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 包提供了大量自由度极高的参数选项对绘制的相关性热图进行调整.
绘制效果如下图所示:
从上图可以看出,与 Seaborn 相比,R 语言的相关性热力图具有以下几个显著的优势:
显然我们希望在 Python 中也能像这样轻松第绘制更加美观和华丽的相关性热力图.
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 参数决定了用于层次聚类的链接方法。这些方法定义了如何计算聚类之间的距离。常见的链接方法包括:
这些方法是通过 scipy.cluster.hierarchy.linkage 函数实现的。选择不同的方法会影响聚类结果,从而影响相关性矩阵的排序.
order_metric
参数order_metric 参数决定了用于计算距离的度量标准。常见的度量标准包括:
这些度量标准是通过 scipy.spatial.distance 或 scipy.cluster.hierarchy 提供的。选择不同的距离度量会影响聚类计算的结果.
在使用中,order_method 和 order_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.linkage,hierarchy.fcluster 和 hierarchy.dendrogram 分别用于获取聚类结果和绘制树状图.
cmap
参数Biokit 源代码中应用 camp 参数的方法是:
self.cm = cmap_builder(cmap)
所以你可以使用如下的指定 colormap 的方法:
cmap='viridis'
cmap=['#2F7FC1', '#FFFFFF', '#D8383A']
⚠ ⚠ ⚠ 不要使用 如下的方法指定 colormap,否则将会报错:
# 不要这样做!
import matplotlib.pyplot as plt
from
cmap = plt.cm.get_cmap('inferno') # 获取cmap对象
data = ...
... # 中间代码略
corrp = Corrplot(data)
corrp.plot(
cmap=cmap
)
回到本文最开头的那张图片,绘制这张图片我使用了如下的代码:
import pandas as pd
import matplotlib.pyplot as plt
from biokit.viz import Corrplot
data = 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
但是仔细查看源代码之后,我发现想要修复这个问题使 .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 precision
if 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 coefficient
vmin=-1.0,
vmax=1.0)
# select colors for each `d`
# with normalized colormap
edgecolor = self.cm(
color_norm(d))
# plot the label with the color
ax.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,然后在本地通过源码构建安装.
如果您的计算机环境上已经配置过 Git 工具则可以使用下面的命令拉取项目到本地:
git clone https://github.com/GitHubonline1396529/biokit.git
进入本地项目文件夹并构建安装源码:
cd ./biokit
pip install .
注意!不要再使用 python -u ./setup.py 了! 这种安装方式已经严重过时,被弃用了。(居然到现在为止 CSDN 上还有那么多博文在建议这样构建源码,每天都有一大堆新手跑过来问我。我还能说什么?) 。
Biokit 是一个功能强大的库,尽管本文仅介绍其热力图的绘制,但是实际上这个工具包的功能非常的多,有待读者们发现。但是中文互联网上对于 Biokit 的介绍很少,我直接通过 Bing 搜索找到的也只有腾讯云社区上的 BioKit!让你用Python也可以轻松绘制矩阵热力图... 这一篇.
不知道原项目后面会不会更新,但是这么好的项目沉了也是蛮可惜的。但是凭我自学 Python 两年半的功夫肯定是更新不动这么大的一个项目的.
我也相当于是在这里问问有没有人愿意提供帮助吧.
最后此篇关于Python——比Seaborn更好的相关性热力图:BiokitCorrplot的文章就讲到这里了,如果你想了解更多关于Python——比Seaborn更好的相关性热力图:BiokitCorrplot的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!