日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在一个热图中使用多个颜色主题

發布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在一个热图中使用多个颜色主题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有一些用戶希望在一個熱圖中使用多個顏色主題,可能是為了突出組間的差異。如果組與組(例如不同的列)也在熱圖上分隔出來(比如使用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/#/?

在線繪制上面所有圖形


往期精品(點擊圖片直達文字對應教程)

機器學習

后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集

總結

以上是生活随笔為你收集整理的在一个热图中使用多个颜色主题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。