寫在前面
這幾天看到一直有人在重複這個圖,之前看到過base plot的版本,看到過ggplot2的版本。這裡就把之前使用complexheatmap繪製的版本也拿來和大家分享一下。
主要操作
加載包
注意:ComplexHeatmap包的安裝需要安裝github版本的。很多函數在bioconductor版本沒有。
另外由於complexheatmap在繪製熱圖的時候,對於顏色的指定是需要用到circlize包的colorRamp2函數,所以需要提前加載。
library(ComplexHeatmap)library(circlize)Sys.setenv(LANGUAGE = "en") #顯示英文報錯信息options(stringsAsFactors = FALSE) #禁止chr轉成factor
輸入文件
輸入文件使用之前的示例文件
# 左上角的數據up <- read.table("easy_input_amp.txt",sep = "\t",row.names = 1,check.names = F,stringsAsFactors = F,header = T)up[1:3, 1:3]## KIRC KIRP KICH## ALKBH5 0.04924242 0.5902778 0.00000000## FTO 0.18560606 0.5243056 0.31818182## ZC3H13 0.03977273 0.1006944 0.03030303# 右下角的數據dn <- read.table("easy_input_del.txt",sep = "\t",row.names = 1,check.names = F,stringsAsFactors = F,header = T)dn[1:3, 1:3]## KIRC KIRP KICH## ALKBH5 0.08522727 0.04861111 0.75757576## FTO 0.04166667 0.02430556 0.07575758## ZC3H13 0.15340909 0.08333333 0.66666667# 檢驗兩個矩陣列名和行名是一致的identical(rownames(up), rownames(dn))## [1] TRUEidentical(colnames(up), colnames(dn))## [1] TRUE繪圖前處理
由於加載的數據的基因名和注釋的結果的列是反的,重新排列數據框
RightOrder <- rev(rownames(up))up <- up[RightOrder,]dn <- dn[RightOrder,]設置顏色
對於ComplexHeatmap當中的顏色設置都是通過,colorRamp2來進行設置的
UpColor <- colorRamp2(breaks = c(0, 1), colors = c("#FFFADD","#AB221F"))DnColor <- colorRamp2(breaks = c(0, 1), colors = c("#FFFADD","#3878C1"))繪圖
使用ComplexHeatmap繪圖的原理主要是
選擇一個數據集,繪製一個空的邊框。對於熱圖當中的聚類,則是基於這個數據集來進行的。同時熱圖的繪製會自動產生一個顏色的注釋,這個不是我們需要的,所以需要去掉。## 使用up數據集來產生數據Heatmap(up, column_title = "Copy number variation across cancer types", ## 列的標題 rect_gp = gpar(type = "none"), #繪製空的數據框 show_heatmap_legend = F, ##是否顯示基本的注釋說明 cluster_rows = T, cluster_columns = T, ## 是否對行列進行聚類 )
繪製左側的注釋信息使用HeatmapAnnotation繪製注釋信息,
row_an <- HeatmapAnnotation(type = c(rep("R", 10), rep("W", 8), rep("E", 2)), ##注釋信息的內容。 show_annotation_name = F, ## 是否顯示注釋的標題 col = list(type = c("R" = "#5AC9FA", "W" = "#FAC67A", "E" = "#51B743")), ## 注釋信息的顏色 show_legend = T, ## 是否顯示注釋信息的說明 annotation_legend_param = list(title = "m6A group",nrow = 1), ## 注釋信息圖例的個性化說明,nrow表示把所有分類的圖例放到一行。 which = "row"#對行或者列進行注釋 )通過cell_fun參數來自定義每個熱圖方格內顯示的內容。這裡我們主要通過兩個grid.polygon繪製兩個三角形,三角形當中的填充色分別是up和down的值。首先自定義一個接受兩個數據集合的函數
DiagFunc <- function(up, down){function(j, i, x, y, width, height, fill){ grid.polygon(unit.c(x - 0.5*width, x - 0.5*width, x + 0.5*width), unit.c(y - 0.5*height, y + 0.5*height, y + 0.5*height), gp = gpar(fill = DnColor(down[i, j]), col = "grey")) grid.polygon(unit.c(x + 0.5*width, x + 0.5*width, x - 0.5*width), unit.c(y + 0.5*height, y - 0.5*height, y - 0.5*height), gp = gpar(fill = UpColor(up[i, j]), col = "grey")) }}繪製基本圖形
p1 <- Heatmap(up, column_title = "Copy number variation across cancer types", rect_gp = gpar(type = "none"), show_heatmap_legend = F, cluster_rows = F, cluster_columns = T, ##繪製空的熱圖框 left_annotation = row_an, ##添加左側注釋信息 cell_fun = DiagFunc(up = up, down = dn) ## 繪製表格內的內容 ); p1
繪製注釋
圖片基本繪製完成,但是熱圖當中的顏色還沒有具體的說明,ComplexHeatmap可以通過Legend繪製自定義注釋。
lgd <- list(Legend(title = "CNV Gain", ## 注釋的標題 col_fun = UpColor, ## 注釋的顏色 at = c(0,0.5,1), ## 注釋刻度的分組 direction = "horizontal"## 注釋的方向 ), Legend(title = "CNV Loss", ## 注釋的標題 col_fun = DnColor, ## 注釋的顏色 at = c(0,0.5,1), ## 注釋刻度的分組 direction = "horizontal"## 注釋的方向 ) )熱圖和注釋融合到一起
通過draw函數可以把熱圖和注釋融合到一起
draw(p1, annotation_legend_list = lgd, annotation_legend_side = "bottom", heatmap_legend_side = "bottom", merge_legend = TRUE)
熱圖專輯
聽說你還不會畫熱圖多個熱圖,多種配色,還要分開畫圖例?連續型和離散型數據一起畫熱圖,外加分開配色和圖例不同數據集畫出的熱圖,用同樣的顏色區間上色?一個更好用的pheatmap用ggplot2來畫帶有對角線的熱圖。看Y叔的R包,寫自己的圖層。視頻教學-小白也能點點滑鼠畫出對角線熱圖