在一个热图中使用多个颜色主题
有一些用戶希望在一個熱圖中使用多個顏色主題,可能是為了突出組間的差異。如果組與組(例如不同的列)也在熱圖上分隔出來(比如使用column split),那么每個組可以創建為單獨的熱圖,然后將這些列表拼接起來。
在下面的例子中,我們假設熱圖在列上有兩組,組A和組B。其中組A使用顏色:綠色-黑色-紅色,組B使用紫色-白色-橘色。
set.seed(123) mat?=?cbind(rbind(matrix(rnorm(20*20,?mean?=?1,?sd?=?0.5),?nr?=?20),matrix(rnorm(20*20,?mean?=?0,?sd?=?0.5),?nr?=?20),matrix(rnorm(20*20,?mean?=?0,?sd?=?0.5),?nr?=?20)),rbind(matrix(rnorm(20*20,?mean?=?0,?sd?=?0.5),?nr?=?20),matrix(rnorm(20*20,?mean?=?1,?sd?=?0.5),?nr?=?20),matrix(rnorm(20*20,?mean?=?0,?sd?=?0.5),?nr?=?20)),rbind(matrix(rnorm(20*20,?mean?=?0.5,?sd?=?0.5),?nr?=?20),matrix(rnorm(20*20,?mean?=?0.5,?sd?=?0.5),?nr?=?20),matrix(rnorm(20*20,?mean?=?1,?sd?=?0.5),?nr?=?20)))?+?matrix(rnorm(60*60,?sd?=?0.5),?nr?=?60) group?=?rep(c("A",?"B"),?times?=?c(40,?20)) group?=?sample(group,?length(group))library(circlize) library(ComplexHeatmap)col1?=?colorRamp2(c(-2,?0,?2),?c("green",?"black",?"red")) col2?=?colorRamp2(c(-2,?0,?2),?c("purple",?"white",?"orange"))ht1?=?Heatmap(mat[,?group?==?"A"],?col?=?col1,?name?=?"Group_A") ht2?=?Heatmap(mat[,?group?==?"B"],?col?=?col2,?name?=?"Group_B") ht1?+?ht2這個方法的問題在于對于行的聚類只是來自于第一個熱圖,也就是對應于組A的子矩陣。這個問題可以通過如下方法解決:在構建熱圖之前,使用完整的矩陣進行對列的聚類,然后將聚類結果保存在一個變量中,最后在draw()函數中,將此聚類變量賦予cluser_rows變量。
row_hlust?=?hclust(dist(mat)) draw(ht1?+?ht2,?cluster_rows?=?row_hlust)好,現在,或許有人會說,不,我不想將原始的矩陣分開,我就是想將其作為一個完整的矩陣。那么此時,熱圖必須要包含兩種不同的顏色主題,那么,一般的繪制熱圖的方法將不能使用,我們得手動根據當前不同的顏色主題繪制熱圖的格子。我們將使用cell_fun或layer_fun參數來手動繪制熱圖。
首次,我們要關閉默認的熱圖格子繪制,這可以在Heatmap()函數中設置rect_gp = gpar(type = "none"),同時,熱圖的legend也不用繪制,這可以設置show_heatmap_legend = FALSE。我們會手動生成對應于兩個顏色主題的legend。
下面的代碼展示了如何通過cell_fun來手動繪制熱圖格子。其中,當當前格子屬于組A時,我們用col1顏色主題,而當當前格子屬于組B時,我們用col2顏色主題。
ht?=?Heatmap(mat,?rect_gp?=?gpar(type?=?"none"),?show_heatmap_legend?=?FALSE,cell_fun?=?function(j,?i,?x,?y,?w,?h,?fill)?{if(group[j]?==?"A")?{grid.rect(x,?y,?w,?h,?gp?=?gpar(fill?=?col1(mat[j,?i]),?col?=?NA))}?else?{grid.rect(x,?y,?w,?h,?gp?=?gpar(fill?=?col2(mat[j,?i]),?col?=?NA))}})然后我們根據col1和col2創建兩個legend:
draw(ht,?heatmap_legend_list?=?list(Legend(title?=?"Group_A",?col_fun?=?col1),Legend(title?=?"Group_B",?col_fun?=?col2) ))cell_fun是一個格子一個格子畫的。如果熱圖很大時,使用cell_fun可能會變得很慢,那么我們可以使用其向量化(vectorized)的版本:layer_fun,見如下代碼。關于layer_fun的具體解釋請見ComplexHeatmap book。
ht?=?Heatmap(mat,?rect_gp?=?gpar(type?=?"none"),?show_heatmap_legend?=?FALSE,layer_fun?=?function(j,?i,?x,?y,?w,?h,?fill)?{l?=?group[j]?==?"A"grid.rect(x[l],?y[l],?w[l],?h[l],?gp?=?gpar(fill?=?col1(pindex(mat,?i[l],?j[l])),?col?=?NA))l?=?group[j]?==?"B"grid.rect(x[l],?y[l],?w[l],?h[l],?gp?=?gpar(fill?=?col2(pindex(mat,?i[l],?j[l])),?col?=?NA))}) draw(ht,?heatmap_legend_list?=?list(Legend(title?=?"Group_A",?col_fun?=?col1),Legend(title?=?"Group_B",?col_fun?=?col2) ))這生成和上圖一模一樣的圖。
我們可以使用相同的方法對一個對稱的矩陣添加兩個不同的顏色主題(上三角矩陣和下三角矩陣):
corm?=?cor(mat) col1?=?colorRamp2(c(-1,?0,?1),?c("green",?"black",?"red")) col2?=?colorRamp2(c(-1,?0,?1),?c("purple",?"white",?"orange"))#?here?reordering?the?symmetric?matrix?is?necessary od?=?hclust(dist(corm))$order corm?=?corm[od,?od]ht?=?Heatmap(corm,?rect_gp?=?gpar(type?=?"none"),?show_heatmap_legend?=?FALSE,cluster_rows?=?FALSE,?cluster_columns?=?FALSE,layer_fun?=?function(j,?i,?x,?y,?w,?h,?fill)?{l?=?i?>?jgrid.rect(x[l],?y[l],?w[l],?h[l],?gp?=?gpar(fill?=?col1(pindex(corm,?i[l],?j[l])),?col?=?NA))l?=?i?<?jgrid.rect(x[l],?y[l],?w[l],?h[l],?gp?=?gpar(fill?=?col2(pindex(corm,?i[l],?j[l])),?col?=?NA))}) draw(ht,?heatmap_legend_list?=?list(Legend(title?=?"Group_A",?col_fun?=?col1),Legend(title?=?"Group_B",?col_fun?=?col2) ))點擊鏈接
http://www.ehbio.com/Cloud_Platform/front/#/?
在線繪制上面所有圖形
往期精品(點擊圖片直達文字對應教程)
機器學習
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
總結
以上是生活随笔為你收集整理的在一个热图中使用多个颜色主题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cell重磅发现:人类胎儿全身组织中都含
- 下一篇: 竟然被awk生成的随机数给整蒙了,也谈随