热图绘制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了热图绘制相关的知识,希望对你有一定的参考价值。
参考技术A公众号链接: http://mp.weixin.qq.com/s/mNSkf1rjWTCtE1pIOuI2rA
热图是做分析时常用的展示方式,简单、直观、清晰。可以用来显示基因在不同样品中表达的高低、表观修饰水平的高低等。任何一个数值矩阵都可以通过合适的方式用热图展示。
本篇使用R的 ggplot2 包实现从原始数据读入到热图输出的过程,并在教程结束后提供一份封装好的命令行绘图工具,只需要提供矩阵,即可一键绘图。
上一篇讲述了Rstudio的使用作为R写作和编译环境的入门,后面的命令都可以拷贝到Rstudio中运行,或写成一个R脚本,使用 Rscript heatmap.r 运行。我们还提供了Bash的封装,在不修改R脚本的情况下,改变参数绘制出不同的图形。
绘图首先需要数据。通过生成一堆的向量,转换为矩阵,得到想要的数据。
注意:运算符的优先级。
Vector转为矩阵 (matrix),再转为数据框 (data.frame)。
虽然方法比较繁琐,但一个数值矩阵已经获得了。
还有另外2种获取数值矩阵的方式。
可以看到列名字中以数字开头的列都加了 X 。一般要尽量避免行或列名字以 数字开头 ,会给后续分析带去一些困难;另外名字中出现的非字母、数字、下划线、点的字符都会被转为 点 ,也需要注意,尽量只用字母、下划线和数字。
与上一步类似,只是改为文件名,不再赘述。
数据读入后,还需要一步格式转换。在使用ggplot2作图时,有一种长表格模式是最为常用的,尤其是数据不规则时,更应该使用 (这点,我们在讲解箱线图时再说)。
数据转换后就可以画图了,分解命令如下:
热图出来了,但有点不对劲,横轴重叠一起了。一个办法是调整图像的宽度,另一个是旋转横轴标记。
设置想要的颜色。
调整legend的位置。
调整背景和背景格线以及X轴、Y轴的标题。
合并以上命令,就得到了下面这个看似复杂的绘图命令。
图形出来了,就得考虑存储了,
至此,完成了简单的heatmap的绘图。但实际绘制时,经常会碰到由于数值变化很大,导致颜色过于集中,使得图的可读性下降很多。因此需要对数据进行一些处理,具体的下次再说。
根据 Seaborn 中的散点图绘制热图
【中文标题】根据 Seaborn 中的散点图绘制热图【英文标题】:Plotting a heatmap based on a scatterplot in Seaborn 【发布时间】:2022-01-21 18:02:50 【问题描述】:有什么方法可以根据散点图在 seaborn 中绘制热图?例如,我有以下散点图,并希望以这样的方式绘制相应的热图,使热图中的较暗点在散点图中显示更拥挤的区域。
【问题讨论】:
不确定是否有内置函数,但您是否查看过 Kernel Density Estimators? 【参考方案1】:您可以再使用一个变量来跟踪其附近的点数。然后在散点图中使用该可变广告颜色。
【讨论】:
【参考方案2】:matplotlib.pyplot.hist2d
将在“常规”matplotlib 中完成此操作。看起来seaborn.histplot
也可以做到这一点(向下滚动示例,它谈到了在指定x
和y
参数时制作二元直方图)
【讨论】:
【参考方案3】:sns.histplot(x=x_data, y=y_data)
将创建给定数据的二维直方图。 sns.kdeplot(x=x_data, y=y_data)
会对这些值进行平均,从而创建一个二维概率密度函数的近似值。
这是使用 iris 数据集的 3 个图之间的比较。
import matplotlib.pyplot as plt
import seaborn as sns
fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(15, 4), sharex=True, sharey=True)
iris = sns.load_dataset('iris')
sns.set_style('darkgrid')
sns.scatterplot(x=iris['sepal_length'], y=iris['sepal_width'], ax=ax1)
sns.histplot(x=iris['sepal_length'], y=iris['sepal_width'], ax=ax2)
sns.kdeplot(x=iris['sepal_length'], y=iris['sepal_width'], fill=True, ax=ax3)
ax1.set_title('scatterplot')
ax2.set_title('histplot')
ax3.set_title('kdeplot')
plt.tight_layout()
plt.show()
【讨论】:
您可能还对在 x 和 y 方向添加直方图(或 kde 图)的sns.jointplot()
感兴趣。以上是关于热图绘制的主要内容,如果未能解决你的问题,请参考以下文章