|
热图作为最常用的可视化图表之一,更加个性化、可定制的呈现是大家关注的重点。
一般热图图例是均匀的:
(左:取对数后图例;右:原始数据图例)
上图是同一个矩阵,根据数据分布定义了四种配色(白→蓝→黄→红)后对应渐变图例的效果。取对数后比较正常,但如果我们使用原始数据绘图,并定义非均匀的配色刻度时,可以看到蓝色部分对应的数据量由于太小(几百)从而无法在图例中展示。
遇到这些情况,我们就需要定制一种能显示不均匀刻度的图例了,如下图:
(调整后:不均匀刻度图例)
下面开始今天的学习,用到ComplexHeatmap包!
- #相关R包载入:
- library(circlize)
- library(ComplexHeatmap)
- #载入ComplexHeatmap包自带测试数据集:
- ##1930-2001美国各州的麻疹疫苗案例数;
- mat <- readRDS(system.file("extdata", "measles.rds", package = "ComplexHeatmap"))
- mat[1:6,1:6]
复制代码
- #矩阵取对数:
- dt <- log2(mat+1)
- dt[1:6,1:6]
复制代码
- col <- colorRamp2(c(0, 4, 8, 16), c("white", "#7a97ee", "yellow", "#fc3b01"))
- Heatmap(
- dt,
- col = col,
- rect_gp = gpar(col= "white"), #描边颜色
- cluster_columns = FALSE,#是否对列聚类
- show_column_names = FALSE, #是否显示列名
- cluster_rows = TRUE, #是否对行聚类
- show_row_dend = FALSE, #是都显示行聚类树
- row_names_side = "left",#行名显示方向
- row_names_gp = gpar(fontsize = 8), #行名字号
- name = "log2Cases", #图例名
- )
复制代码
取对数只能反应趋势,但假如我们的诉求是用热图展示真实的案例数,并根据所关注的数量级来自定义热图配色:
- col <- colorRamp2(c(0, 600, 1000, 100000), c("white", "#0d4be5", "yellow", "#e90304"))
- Heatmap(
- mat,
- col = col,
- rect_gp = gpar(col= "white"),
- cluster_columns = FALSE,
- show_column_names = FALSE,
- cluster_rows = TRUE,
- show_row_dend = FALSE,
- row_names_side = "left",
- row_names_gp = gpar(fontsize = 8),
- name = "Cases",
- )
复制代码
此时图例仍然是均匀分布的,无法显示热图中蓝色部分对应的数据大小。
下面使用heatmap_legend_param这个参数来定制图例。
- #添加非均匀刻度图例:
- Heatmap(
- mat,
- col = col,
- rect_gp = gpar(col= "white"),
- cluster_columns = FALSE,
- show_column_names = FALSE,
- cluster_rows = TRUE,
- show_row_dend = FALSE,
- row_names_side = "left",
- row_names_gp = gpar(fontsize = 8),
- name = "Cases",
- heatmap_legend_param = list(
- at = c(0, 400, 800, 50000, 100000, 150000) #指定图例显示刻度
- )
- )
复制代码
此时还是看不到蓝色(对应600),0-800的部分由于数据差异过大都在底部被压缩。不过没关系,我们可以自定义刻度间的相对距离。
- #自定义图例标签+调整刻度间距离:
- Heatmap(
- mat,
- col = col,
- rect_gp = gpar(col= "white"),
- cluster_columns = FALSE,
- show_column_names = FALSE,
- cluster_rows = TRUE,
- show_row_dend = FALSE,
- row_names_side = "left",
- row_names_gp = gpar(fontsize = 8),
- name = "Cases",
- heatmap_legend_param = list(
- at = c(0, 400, 800, 50000, 100000, 150000),
- labels = c("0", "400", "800", "50k", "100k", "150k"), #指定刻度对应的显示标签
- break_dist = c(1.5, 1.5, 3, 3, 3) #显示刻度间的相对距离
- )
- )
复制代码
此时就能将图例和热图对应上啦!蓝色部分对应的Cases一目了然!
刻度连接线的存在为了让分布不均匀的标签之间不会重叠,如果大家不想展示,可以通过拉长图例来增加标签的空间。
- #图例高度调整:
- Heatmap(
- mat,
- col = col,
- rect_gp = gpar(col= "white"),
- cluster_columns = FALSE,
- show_column_names = FALSE,
- cluster_rows = TRUE,
- show_row_dend = FALSE,
- row_names_side = "left",
- row_names_gp = gpar(fontsize = 8),
- name = "Cases",
- heatmap_legend_param = list(
- at = c(0, 400, 800, 50000, 100000, 150000),
- labels = c("0", "400", "800", "50k", "100k", "150k"),
- break_dist = c(1.5, 1.5, 3, 3, 3),
- legend_height = unit(4.5, "cm") #图例的高度(纵向图例,调整高度;横向图例,调整宽度)
- )
- )
复制代码
- #还可以把图例打横放到热图底部:
- p <- Heatmap(
- mat,
- col = col,
- rect_gp = gpar(col= "white"),
- cluster_columns = FALSE,
- show_column_names = FALSE,
- cluster_rows = TRUE,
- show_row_dend = FALSE,
- row_names_side = "left",
- row_names_gp = gpar(fontsize = 8),
- name = "Cases",
- heatmap_legend_param = list(
- at = c(0, 400, 800, 50000, 100000, 150000),
- labels = c("0", "400", "800", "50k", "100k", "150k"),
- break_dist = c(1.5, 1.5, 3, 3, 3),
- legend_width = unit(8, "cm"), #横向图例记得调整的是宽度
- direction = "horizontal", #图例方向
- title_position = "lefttop" #图例标题位置
- )
- )
- draw(p, heatmap_legend_side = "bottom")
复制代码
- #更换一个配色:
- col2 <- colorRamp2(c(0, 600, 1000, 100000), c("white", "#66be63", "yellow", "#772584"))
- Heatmap(
- mat,
- col = col2,
- rect_gp = gpar(col= "white"),
- cluster_columns = FALSE,
- show_column_names = FALSE,
- cluster_rows = TRUE,
- show_row_dend = FALSE,
- row_names_side = "left",
- row_names_gp = gpar(fontsize = 8),
- name = "Cases",
- heatmap_legend_param = list(
- at = c(0, 400, 800, 50000, 100000, 150000),
- labels = c("0", "400", "800", "50k", "100k", "150k"),
- break_dist = c(1.5, 1.5, 3, 3, 3),
- legend_height = unit(4.5, "cm") #图例的高度
- )
- )
复制代码
好啦,今天的分享就到这里!更多个性化热图绘制可戳往期:
个性化热图绘制:
《分享几种热图的画法》
《环形热图的绘制方法》
《多维度数据展示!双边热图了解一下?》
指定热图分组和基因标记:
《个性化热图如此简单?加分组/指定基因标签简直小case!》
《如何为热图添加指定的基因标记?》
《如何提取热图聚类簇中的基因?》
组合型热图绘制:
《如何绘制漂亮的组合热图》
《彩!这般漂亮又个性的热图怎么画》
《如何绘制通路图与热图的组合图?》
参考资料
https://mp.weixin.qq.com/s/vbJYTu-__jHZqT__0-5pgA
*未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。
本文作者:基迪奥-喵酱
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|