R语言学习 - 热图美化 (数值标准化和调整坐标轴顺序)
生物信息學習的正確姿勢
NGS系列文章包括NGS基礎、在線繪圖、轉錄組分析?(Nature重磅綜述|關于RNA-seq你想知道的全在這)、ChIP-seq分析?(ChIP-seq基本分析流程)、單細胞測序分析?(重磅綜述:三萬字長文讀懂單細胞RNA測序分析的最佳實踐教程)、DNA甲基化分析、重測序分析、GEO數據挖掘(典型醫學設計實驗GEO數據分析 (step-by-step))、批次效應處理等內容。
溫故知新
R語言 - 入門環境Rstudio
R語言 - 熱圖繪制 (heatmap)
R語言 - 基礎概念和矩陣操作
R語言 - 熱圖簡化
熱圖美化
上一期的繪圖命令中,最后一行的操作抹去了之前設定的橫軸標記的旋轉,最后出來的圖比較難看。上次我們是這么寫的
為了使橫軸旋轉45度,需要把這句話:
theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1))放在theme_bw()的后面。
p <- p + theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1))最后的圖應該是下邊樣子的。
上圖的測試數據,數值的分布比較均一,相差不是太大,但是Gene_4和Gene_5由于整體的值低于其它的基因,從顏色上看,不仔細看,看不出差別。
實際應用中,異常值的出現會毀掉一張熱圖,如下是一個例子。
data <- c(rnorm(5,mean=5), rnorm(5,mean=20), rnorm(5, mean=100), c(600,700,800,900,10000)) data <- matrix(data, ncol=5, byrow=T) data <- as.data.frame(data) rownames(data) <- letters[1:4] colnames(data) <- paste("Grp", 1:5, sep="_") data ? ? ? Grp_1 ? ? ?Grp_2 ? ? ?Grp_3 ? ? ?Grp_4 ? ? ? ?Grp_5 a ? 5.958073 ? 5.843652 ? 3.225465 ? 4.886184 ? ? 3.411362 b ?19.630582 ?20.376791 ?20.744580 ?18.534027 ? ?20.638288 c 100.351299 ?99.849900 102.197343 ?98.583629 ? ?99.540488 d 600.000000 700.000000 800.000000 900.000000 10000.000000data$ID <- rownames(data) data ? ? ? Grp_1 ? ? ?Grp_2 ? ? ?Grp_3 ? ? ?Grp_4 ? ? ? ?Grp_5 ID a ? 5.958073 ? 5.843652 ? 3.225465 ? 4.886184 ? ? 3.411362 ?a b ?19.630582 ?20.376791 ?20.744580 ?18.534027 ? ?20.638288 ?b c 100.351299 ?99.849900 102.197343 ?98.583629 ? ?99.540488 ?c d 600.000000 700.000000 800.000000 900.000000 10000.000000 ?ddata_m <- melt(data, id.vars=c("ID")) head(data_m) ?ID variable ? ? ?value 1 ?a ? ?Grp_1 ? 5.958073 2 ?b ? ?Grp_1 ?19.630582 3 ?c ? ?Grp_1 100.351299 4 ?d ? ?Grp_1 600.000000 5 ?a ? ?Grp_2 ? 5.843652 6 ?b ? ?Grp_2 ?20.376791p <- ggplot(data_m, aes(x=variable,y=ID)) + xlab("samples") + theme_bw() + theme(panel.grid.major = element_blank()) + theme(legend.key=element_blank()) ?+ theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1)) + theme(legend.position="top") + ?geom_tile(aes(fill=value)) + scale_fill_gradient(low = "white", high = "red") p dev.off()輸出的結果是這個樣子的
圖中只有右上角可以看到紅色,其他地方就沒了顏色的差異。這通常不是我們想要的。為了更好的可視化效果,需要對數據做些預處理,主要有 對數轉換,Z-score轉換,抹去異常值,非線性顏色等方式。
對數轉換
為了方便描述,假設下面的數據是基因表達數據,4個基因 (a, b, c, d)和5個樣品 (Grp_1, Grp_2, Grp_3, Grp_4),矩陣中的值代表基因表達FPKM值。
data <- c(rnorm(5,mean=5), rnorm(5,mean=20), rnorm(5, mean=100), c(600,700,800,900,10000)) data <- matrix(data, ncol=5, byrow=T) data <- as.data.frame(data) rownames(data) <- letters[1:4] colnames(data) <- paste("Grp", 1:5, sep="_") data ? ?Grp_1 ? ? ?Grp_2 ? ? ?Grp_3 ? ? ?Grp_4 ? ? ? ?Grp_5 a ? 6.61047 ?20.946720 100.133106 600.000000 ? ? 5.267921 b ?20.80792 ?99.865962 700.000000 ? 3.737228 ? ?19.289715 c 100.06930 800.000000 ? 6.252753 ?21.464081 ? ?98.607518 d 900.00000 ? 3.362886 ?20.334078 101.117728 10000.000000# 對數轉換 # +1是為了防止對0取對數;是加1還是加個更小的值取決于數據的分布。 # 加的值一般認為是檢測的低閾值,低于這個值的數字之間的差異可以忽略。 data_log <- log2(data+1) data_log ? ?Grp_1 ? ?Grp_2 ? ?Grp_3 ? ?Grp_4 ? ? Grp_5 a 2.927986 4.455933 6.660112 9.231221 ?2.647987 b 4.446780 6.656296 9.453271 2.244043 ?4.342677 c 6.659201 9.645658 2.858529 4.489548 ?6.638183 d 9.815383 2.125283 4.415088 6.674090 13.287857data_log$ID = rownames(data_log) data_log_m = melt(data_log, id.vars=c("ID"))p <- ggplot(data_log_m, aes(x=variable,y=ID)) + xlab("samples") + ylab(NULL) + theme_bw() + theme(panel.grid.major = element_blank()) + theme(legend.key=element_blank()) + theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1)) + theme(legend.position="top") + ?geom_tile(aes(fill=value)) + scale_fill_gradient(low = "white", high = "red") ggsave(p, filename="heatmap_log.pdf", width=8, height=12, units=c("cm"),colormodel="srgb")對數轉換后的數據,看起來就清晰的多了。而且對數轉換后,數據還保留著之前的變化趨勢,不只是基因在不同樣品之間的表達可比 (同一行的不同列),不同基因在同一樣品的值也可比 (同一列的不同行) (不同基因之間比較表達值存在理論上的問題,即便是按照長度標準化之后的FPKM也不代表基因之間是完全可比的)。
Z-score轉換
Z-score又稱為標準分數,是一組數中的每個數減去這一組數的平均值再除以這一組數的標準差,代表的是原始分數距離原始平均值的距離,以標準差為單位??梢詫Σ煌植嫉母髟挤謹颠M行比較,用來反映數據的相對變化趨勢,而非絕對變化量。
data_ori <- "Grp_1;Grp_2;Grp_3;Grp_4;Grp_5 a;6.6;20.9;100.1;600.0;5.2 b;20.8;99.8;700.0;3.7;19.2 c;100.0;800.0;6.2;21.4;98.6 d;900;3.3;20.3;101.1;10000"data <- read.table(text=data_ori, header=T, row.names=1, sep=";", quote="")# 去掉方差為0的行,也就是值全都一致的行 data <- data[apply(data,1,var)!=0,]data ?Grp_1 Grp_2 Grp_3 Grp_4 ? Grp_5 a ? 6.6 ?20.9 100.1 600.0 ? ? 5.2 b ?20.8 ?99.8 700.0 ? 3.7 ? ?19.2 c 100.0 800.0 ? 6.2 ?21.4 ? ?98.6 d 900.0 ? 3.3 ?20.3 101.1 10000.0# 標準化數據,獲得Z-score,并轉換為data.frame data_scale <- as.data.frame(t(apply(data,1,scale)))# 重命名列 colnames(data_scale) <- colnames(data) data_scale ? ? ? Grp_1 ? ? ?Grp_2 ? ? ?Grp_3 ? ? ?Grp_4 ? ? ?Grp_5 a -0.5456953 -0.4899405 -0.1811446 ?1.7679341 -0.5511538 b -0.4940465 -0.2301542 ?1.7747592 -0.5511674 -0.4993911 c -0.3139042 ?1.7740182 -0.5936858 -0.5483481 -0.3180801 d -0.2983707 -0.5033986 -0.4995116 -0.4810369 ?1.7823177data_scale$ID = rownames(data_scale) data_scale_m = melt(data_scale, id.vars=c("ID"))p <- ggplot(data_scale_m, aes(x=variable,y=ID)) + xlab("samples") + ylab(NULL) + theme_bw() + theme(panel.grid.major = element_blank()) + theme(legend.key=element_blank()) + theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1)) + ?geom_tile(aes(fill=value)) + scale_fill_gradient(low = "white", high = "red") ggsave(p, filename="heatmap_scale.pdf", width=8, height=12, units=c("cm"),colormodel="srgb")Z-score轉換后,顏色分布也相對均一了,每個基因在不同樣品之間的表達的高低一目了然。但是不同基因之間就完全不可比了。
抹去異常值
粗暴一點,假設檢測飽和度為100,大于100的值都視為100對待。
data_ori <- "Grp_1;Grp_2;Grp_3;Grp_4;Grp_5 a;6.6;20.9;100.1;600.0;5.2 b;20.8;99.8;700.0;3.7;19.2 c;100.0;800.0;6.2;21.4;98.6 d;900;3.3;20.3;101.1;10000"data <- read.table(text=data_ori, header=T, row.names=1, sep=";", quote="")data[data>100] <- 100 data ?Grp_1 Grp_2 Grp_3 Grp_4 Grp_5 a ? 6.6 ?20.9 100.0 100.0 ? 5.2 b ?20.8 ?99.8 100.0 ? 3.7 ?19.2 c 100.0 100.0 ? 6.2 ?21.4 ?98.6 d 100.0 ? 3.3 ?20.3 100.0 100.0data$ID = rownames(data) data_m = melt(data, id.vars=c("ID"))p <- ggplot(data_m, aes(x=variable,y=ID)) + xlab("samples") + ylab(NULL) + theme_bw() + theme(panel.grid.major = element_blank()) + theme(legend.key=element_blank()) + theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1)) + ?geom_tile(aes(fill=value)) + scale_fill_gradient(low = "white", high = "red") ggsave(p, filename="heatmap_nooutlier.pdf", width=8, height=12, units=c("cm"),colormodel="srgb")雖然損失了一部分信息,但整體模式還是出來了。只是在選擇異常值標準時需要根據實際確認。
非線性顏色
正常來講,顏色的賦予在最小值到最大值之間是均勻分布的。非線性顏色則是對數據比較小但密集的地方賦予更多顏色,數據大但分布散的地方賦予更少顏色,這樣既能加大區分度,又最小的影響原始數值。通??梢愿鶕祿J?#xff0c;手動設置顏色區間。為了方便自動化處理,我一般選擇用四分位數的方式設置顏色區間。
data_ori <- "Grp_1;Grp_2;Grp_3;Grp_4;Grp_5 a;6.6;20.9;100.1;600.0;5.2 b;20.8;99.8;700.0;3.7;19.2 c;100.0;800.0;6.2;21.4;98.6 d;900;3.3;20.3;101.1;10000"data <- read.table(text=data_ori, header=T, row.names=1, sep=";", quote="")data ?Grp_1 Grp_2 Grp_3 Grp_4 ? Grp_5 a ? 6.6 ?20.9 100.1 600.0 ? ? 5.2 b ?20.8 ?99.8 700.0 ? 3.7 ? ?19.2 c 100.0 800.0 ? 6.2 ?21.4 ? ?98.6 d 900.0 ? 3.3 ?20.3 101.1 10000.0data$ID = rownames(data) data_m = melt(data, id.vars=c("ID")) # 獲取數據的最大、最小、第一四分位數、中位數、第三四分位數 summary_v <- summary(data_m$value) summary_v ? ?Min. ?1st Qu. ? Median ? ? Mean ?3rd Qu. ? ? Max.3.30 ? ?16.05 ? ?60.00 ? 681.40 ? 225.80 10000.00# 在最小值和第一四分位數之間劃出6個區間,第一四分位數和中位數之間劃出6個區間,中位數和第三四分位數之間劃出5個區間,最后的數劃出5個區間 break_v <- unique(c(seq(summary_v[1]*0.95,summary_v[2],length=6),seq(summary_v[2],summary_v[3],length=6),seq(summary_v[3],summary_v[5],length=5),seq(summary_v[5],summary_v[6]*1.05,length=5))) break_v [1] ? ? 3.135 ? ? 5.718 ? ? 8.301 ? ?10.884 ? ?13.467 ? ?16.050 ? ?24.840[8] ? ?33.630 ? ?42.420 ? ?51.210 ? ?60.000 ? 101.450 ? 142.900 ? 184.350 [15] ? 225.800 ?2794.350 ?5362.900 ?7931.450 10500.000# 安照設定的區間分割數據 # 原始數據替換為了其所在的區間的數值 data_m$value <- cut(data_m$value, breaks=break_v,labels=break_v[2:length(break_v)]) break_v=unique(data_m$value)data_m ? ID variable ? value 1 ? a ? ?Grp_1 ? 8.301 2 ? b ? ?Grp_1 ? 24.84 3 ? c ? ?Grp_1 ?101.45 4 ? d ? ?Grp_1 2794.35 5 ? a ? ?Grp_2 ? 24.84 6 ? b ? ?Grp_2 ?101.45 7 ? c ? ?Grp_2 2794.35 8 ? d ? ?Grp_2 ? 5.718 9 ? a ? ?Grp_3 ?101.45 10 ?b ? ?Grp_3 2794.35 11 ?c ? ?Grp_3 ? 8.301 12 ?d ? ?Grp_3 ? 24.84 13 ?a ? ?Grp_4 2794.35 14 ?b ? ?Grp_4 ? 5.718 15 ?c ? ?Grp_4 ? 24.84 16 ?d ? ?Grp_4 ?101.45 17 ?a ? ?Grp_5 ? 5.718 18 ?b ? ?Grp_5 ? 24.84 19 ?c ? ?Grp_5 ?101.45 20 ?d ? ?Grp_5 ? 10500# 雖然看上去還是數值,但已經不是數字類型了 # 而是不同的因子了,這樣就可以對不同的因子賦予不同的顏色了 > is.numeric(data_m$value) [1] FALSE > is.factor(data_m$value) [1] TRUEbreak_v#[1] 8.301 ? 24.84 ? 101.45 ?2794.35 5.718 ? 10500
#18 Levels: 5.718 8.301 10.884 13.467 16.05 24.84 33.63 42.42 51.21 … 10500
調整行的順序或列
如果想保持圖中每一行的順序與輸入的數據框一致,需要設置因子的水平。這也是ggplot2中調整圖例或橫縱軸字符順序的常用方式。
data_rowname <- rownames(data) data_rowname <- as.vector(rownames(data)) data_rownames <- rev(data_rowname) data_log_m$ID <- factor(data_log_m$ID, levels=data_rownames, ordered=T) p <- ggplot(data_log_m, aes(x=variable,y=ID)) + xlab(NULL) + ylab(NULL) + theme_bw() + theme(panel.grid.major = element_blank()) + theme(legend.key=element_blank()) + theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1)) + theme(legend.position="top") + ?geom_tile(aes(fill=value)) + scale_fill_gradient(low = "white", high = "red") ggsave(p, filename="heatmap_log.pdf", width=8, height=12, units=c("cm"),colormodel="srgb")基于ggplot2的heatmap繪制到現在就差不多了,而關于數據可視化還有很多值得探索,還請留意后續分享?
R統計和作圖
Graphpad,經典繪圖工具初學初探
維恩(Venn)圖繪制工具大全 (在線+R包)
在R中贊揚下努力工作的你,獎勵一份CheatShet
別人的電子書,你的電子書,都在bookdown
R語言 - 線圖繪制
R語言 - 線圖一步法
R語言 - 箱線圖(小提琴圖、抖動圖、區域散點圖)
R語言 - 箱線圖一步法
R語言 - 火山圖
R語言 - 富集分析泡泡圖
R語言 - 散點圖繪制
R語言 - 韋恩圖
R語言 - 柱狀圖
R語言 - 圖形設置中英字體
R語言 - 非參數法生存分析
R語言 - 繪制seq logo圖
WGCNA分析,簡單全面的最新教程
psych +igraph:共表達網絡構建
一文學會網絡分析——Co-occurrence網絡圖在R中的實現
一文看懂PCA主成分分析
富集分析DotPlot,可以服
基因共表達聚類分析和可視化
R中1010個熱圖繪制方法
還在用PCA降維?快學學大牛最愛的t-SNE算法吧, 附Python/R代碼
一個函數抓取代謝組學權威數據庫HMDB的所有表格數據
文章用圖的修改和排版
network3D:?交互式?;鶊D
network3D 交互式網絡生成
Seq logo 在線繪制工具——Weblogo
生物AI插圖素材獲取和拼裝指導
ggplot2高效實用指南 (可視化腳本、工具、套路、配色)
圖像處理R包magick學習筆記
SOM基因表達聚類分析初探
利用gganimate可視化全球范圍R-Ladies(R社區性別多樣性組織)發展情況
一分鐘繪制磷脂雙分子層:AI零基礎入門和基本圖形繪制
AI科研繪圖(二):模式圖的基本畫法
你知道R中的賦值符號箭頭(<-)和等號(=)的區別嗎?
R語言可視化學習筆記之ggridges包
利用ComplexHeatmap繪制熱圖(一)
ggplot2學習筆記之圖形排列
R包reshape2,輕松實現長、寬數據表格轉換
用R在地圖上繪制網絡圖的三種方法
PCA主成分分析實戰和可視化 附R代碼和測試數據
iTOL快速繪制顏值最高的進化樹!
12個ggplot2擴展包幫你實現更強大的可視化
編程模板-R語言腳本寫作:最簡單的統計與繪圖,包安裝、命令行參數解析、文件讀取、表格和矢量圖輸出
R語言統計入門課程推薦——生物科學中的數據分析Data Analysis for the Life Sciences
數據可視化基本套路總結
你知道R中的賦值符號箭頭<-和等號=的區別嗎?
使用dplyr進行數據操作30例
交集intersect、并集union、找不同setdiff
R包reshape2,輕松實現長、寬數據表格轉換
1數據類型(向量、數組、矩陣、 列表和數據框)
2讀寫數據所需的主要函數、與外部環境交互
3數據篩選——提取對象的子集
4向量、矩陣的數學運算
5控制結構
6函數及作用域
7認識循環函數lapply和sapply
8分解數據框split和查看對象str
9模擬—隨機數、抽樣、線性模型
1初識ggplot2繪制幾何對象
2圖層的使用—基礎、加標簽、注釋
3工具箱—誤差線、加權數、展示數據分布
4語法基礎
5通過圖層構建圖像
6標度、軸和圖例
7定位-分面和坐標系
8主題設置、存儲導出
9繪圖需要的數據整理技術
創建屬于自己的調色板
28個實用繪圖包,總有幾個適合你
熱圖繪制
R做線性回歸
繪圖相關系數矩陣corrplot
相關矩陣可視化ggcorrplot
繪制交互式圖形recharts
交互式可視化CanvasXpress
聚類分析factoextra
LDA分析、作圖及添加置信-ggord
解決散點圖樣品標簽重疊ggrepel
添加P值或顯著性標記ggpubr
Alpha多樣性稀釋曲線rarefraction curve
堆疊柱狀圖各成分連線畫法:突出組間變化
沖擊圖展示組間時間序列變化ggalluvial
?;鶊Driverplot
微生物環境因子分析ggvegan
五彩進化樹與熱圖更配ggtree
多元回歸樹分析mvpart
隨機森林randomForest?分類Classification?回歸Regression
加權基因共表達網絡分析WGCNA
circlize包繪制circos-plot
R語言搭建炫酷的線上博客系統
28個實用繪圖包,總有幾個適合你
熱圖繪制
R做線性回歸
繪圖相關系數矩陣corrplot
相關矩陣可視化ggcorrplot
繪制交互式圖形recharts
交互式可視化CanvasXpress
聚類分析factoextra
LDA分析、作圖及添加置信-ggord
解決散點圖樣品標簽重疊ggrepel
添加P值或顯著性標記ggpubr
Alpha多樣性稀釋曲線rarefraction curve
堆疊柱狀圖各成分連線畫法:突出組間變化
沖擊圖展示組間時間序列變化ggalluvial
桑基圖riverplot
微生物環境因子分析ggvegan
五彩進化樹與熱圖更配ggtree
多元回歸樹分析mvpart
隨機森林randomForest?分類Classification?回歸Regression
加權基因共表達網絡分析WGCNA
circlize包繪制circos-plot
R語言搭建炫酷的線上博客系統
維恩(Venn)圖繪制工具大全 (在線+R包)
R包circlize:柱狀圖用膩了?試試好看的弦狀圖
獲取pheatmap聚類后和標準化后的結果
增強火山圖,要不要試一下?
一個震撼的交互型3D可視化R包 - 可直接轉ggplot2圖為3D
贈你一只金色的眼 - 富集分析和表達數據可視化
是Excel的圖,不!是R的圖
道友,來Rstudio里面看動畫了
用了這么多年的PCA可視化竟然是錯的!!!
R語言可視化學習筆記之ggridges包
往期精品(點擊圖片直達文字對應教程)
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
總結
以上是生活随笔為你收集整理的R语言学习 - 热图美化 (数值标准化和调整坐标轴顺序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nature子刊:是穷是富与基因有关?大
- 下一篇: 明明不胖,为什么你一直都喊着要减肥?