今天我们尝试复现一个热图,下面图C的右边部分。
下载附表的原始数据。
首先加载需要的包:
library(xlsx)
library(ComplexHeatmap)
library(tidyverse)
library(ggplot2)
library(circlize)
library(patchwork)
library(ggplotify)
library(RColorBrewer)
library(scales)
library(ggsci)
library(paletteer)
加载和处理输入文件:
data <- read.xlsx("41467_2022_31780_MOESM9_ESM.xlsx",sheetIndex=1) #读入excel文件,设置读入的是第一个文件
data <- data[-c(1,2),] #把前两行不要的给去掉
colnames(data) <- data[1,] #设置列名
data <- data[-1,] #把列名那一行去掉
从paper的示意图中可以看出,图中的热图展示的是不同基因在不同tumer type中的数量。这种目的大多可以用table函数实现。
num <- as.matrix(table(data$Gene,data$'Abbreviation of Tumor Type'))
这样子,通过table就获得了各个Tumor Type下面的各个基因的数目。
根据图中设置颜色区间。最低值是白色。根据需要设置一个颜色的区间。
col_fun = colorRamp2(c(0, 5, 10, 15, 20), c("#ffffff","#b4d9e5", "#91a1cf", "#716bbf","#5239a3"))
下面先画一个正常的热图,用ComplexHeatmap包。
draw(Heatmap(num,
col = col_fun,
cluster_rows = T,
cluster_columns = T,
row_names_side = "left",
heatmap_legend_param = list(
title = "Frequency(%)",
title_position = "leftcenter",
legend_direction = "horizontal"
),
row_names_gp = gpar(fontsize = 10, font = 3),
column_names_gp = gpar(fontsize = 10, font = 3),
),
heatmap_legend_side = "bottom"
)
和paper中图片相比,需要改进的地方如下:
1. 行和列的顺序不一样,也就是图片中不是按热图的聚类画的。图中没有聚类。但是从规律来看,列是按所有基因相加排序的。行也是如此。所以我们需要自己排序,然后图中不聚类。
2.需要在热图块中显示非0的基因数目。
data_mat <- num[,order(colSums(num),decreasing=T)] #按列的总和排序
data_mat <- data_mat[order(rowSums(data_mat),decreasing=T),] #按行的总和排序
draw(Heatmap(data_mat,
col = col_fun,
cluster_rows = F,
cluster_columns = F,
row_names_side = "left",
heatmap_legend_param = list(
title = "Frequency(%)",
title_position = "leftcenter",
legend_direction = "horizontal"
),
row_names_gp = gpar(fontsize = 10, font = 3),
column_names_gp = gpar(fontsize = 10, font = 3),
),
heatmap_legend_side = "bottom"
)
再画热图,与paper相比,差不多已经有基本的外型了。行和列的排序也是一样的。就缺把非0 的数字显示了。
Complexheatmap里面是通过grid.text来实现的。
draw(Heatmap(data_mat,
col = col_fun,
cluster_rows = F,
cluster_columns = F,
row_names_side = "left",
#border_gp=gpar(col="white",lty=5),
heatmap_legend_param = list(
title = "Frequency(%)",
title_position = "leftcenter",
legend_direction = "horizontal"
),
row_names_gp = gpar(fontsize = 10, font = 3),
column_names_gp = gpar(fontsize = 10, font = 3),
cell_fun = function(j, i, x, y, width, height, fill) {
if (data_mat[i,j]!=0) {
grid.text(sprintf("%1.f", data_mat[i, j]), x, y,
gp = gpar(fontsize = 10, col = "#df9536"))
}
}
),
heatmap_legend_side = "bottom"
)