R繪圖(2): 離散/分類變數如何畫熱圖/方塊圖
阿新 • • 發佈:2021-01-02
![](https://img2020.cnblogs.com/other/2265439/202101/2265439-20210102175551932-692210017.png)
相信很多人都看到過上面這種方塊圖,有點像“華夫餅圖”的升級版,也有點像“熱圖”的離散版。我在一些臨床多組學的文章裡面看到過好幾次這種圖,用它來展示病人的臨床資訊非常合適,我自己也用R包或者AI畫過類似的圖。今天給大家演示一下,如何用ggplot2裡面的geom_tile函式畫這種圖。
先構造一個練習資料集,假設有15個病人,每個病人有年齡、性別、症狀、是否有RNA-seq和WES測序等資訊。
```
library(ggplot2)
library(tidyverse)
library(reshape2)
library(RColorBrewer)
clinical.df=data.frame(
patient=paste("P",seq(1:15),sep = ""),
age=sample(20:80,15,replace = T),
gander=sample(c("male","female"),15,replace = T),
symptom=sample(c("mild","moderate","severe"),15,replace = T),
RNAseq=sample(c("yes","no"),15,replace = T),
WES=sample(c("yes","no"),15,replace = T)
)
```
年齡可以看做是連續的,我們進一步分成三個level,最終的資料格式如下:
```
clinical.df$age=ifelse(clinical.df$age < 40,"level1",
ifelse(clinical.df$age < 60, "level2","level3"))
# head(clinical.df)
# patient age gander symptom RNAseq WES
# 1 P1 level2 female moderate yes yes
# 2 P2 level2 male mild yes yes
# 3 P3 level2 female mild no no
# 4 P4 level1 male severe no yes
# 5 P5 level2 male mild yes no
# 6 P6 level3 female moderate no yes
```
在使用geom_tile畫方塊圖之前,需要將寬資料轉換為長資料,使用到reshape2中的melt函式
```
clinical.df2=melt(clinical.df,id="patient")
# head(clinical.df2)
# patient variable value
# 1 P1 age level2
# 2 P2 age level2
# 3 P3 age level2
# 4 P4 age level1
# 5 P5 age level2
# 6 P6 age level3
```
接下來,為了自定義圖形橫縱軸變數的順序,可以人為定義因子變數,並指定因子的level。**(這種方法在實際畫圖中,經常用到)**
```
clinical.df2$patient=factor(clinical.df2$patient,levels = paste("P",seq(1:15),sep = ""))
clinical.df2$variable=factor(clinical.df2$variable,levels = c("WES","RNAseq","symptom","gander","age"))
```
然後是自定義顏色,建立一個命名的字串向量,表示顏色的字串都是通過R包RColorBrewer查詢的,可以參考我之前的一篇筆記:[ColorBrewer配色方案](https://www.jianshu.com/p/a0ab7a0bc03b)
```
cols=c(
"level1"="#E5F5E0","level2"="#A1D99B","level3"="#41AB5D",
"male"="#66C2A5","female"="#FC8D62",
"mild"="#377EB8","moderate"="#FFFF33","severe"="#E41A1C",
"yes"="black","no"="lightgrey"
)
```
最後開始畫圖
```
clinical.df2%>%ggplot(aes(x=patient,y=variable))+
geom_tile(aes(fill=value),color="white",size=1)+ #color和size分別指定方塊邊線的顏色和粗細
scale_x_discrete("",expand = c(0,0))+ #不顯示橫縱軸的label文字;畫板不延長
scale_y_discrete("",expand = c(0,0))+
scale_fill_manual(values = cols)+ #指定自定義的顏色
theme(
axis.text.x.bottom = element_text(size=10),axis.text.y.left = element_text(size = 12), #修改座標軸文字大小
axis.ticks = element_blank(), #不顯示座標軸刻度
legend.title = element_blank() #不顯示圖例title
)
ggsave("tmp.pdf",device = "pdf",width = 21,height = 7,units = "cm")
```
![](https://img2020.cnblogs.com/other/2265439/202101/2265439-20210102175552457-903073492.png)
圖中右側的圖例並不是我們想要的,這時還需要用AI稍微編輯一下,最後的效果如下:
![](https://img2020.cnblogs.com/other/2265439/202101/2265439-20210102175552673-1367981411.png)
***
關於ggplot2的學習,我之前整理了幾篇筆記,感興趣的小夥伴可以點選下面的連結進行閱讀
[ggplot2回顧(1): 認識ggplot2](https://www.jianshu.com/p/133334c40432)
[ggplot2回顧(2): 圖層語法入門](https://www.jianshu.com/p/c6d0aef93c0b)
[ggplot2回顧(3): 圖層語法基礎](https://www.jianshu.com/p/19c1cfb3977d)
[ggplot2回顧(4): 瓦片圖、多邊形圖](https://www.jianshu.com/p/3abe53a57dde)
[ggplot2回顧(5): 資料分佈的展示](https://www.jianshu.com/p/8435e09a19d4)
[ggplot2回顧(6): ColorBrewer配色方案](https://www.jianshu.com/p/a0ab7a0bc03b)
[ggplot2回顧(7): geom_bar()和 geom_histogram()比較](https://www.jianshu.com/p/381028858c55)
[ggplot2回顧(8): 標度](https://www.jianshu.com/p/7214f9bf153a)
[ggplot2回顧(9): 分面](https://www.jianshu.com/p/821ac4fbdac5)
[ggplot2回顧(10): 座標系](https://www.jianshu.com/p/d560fb83c433)
[ggplot2回顧(11): 主題設定](https://www.jianshu.com/p/5c228e89810d)
[ggplot2回顧(12): 一頁多圖](https://www.jianshu.com/p/72bf6bf689b1)
[ggplot2回顧(13): 使用plyr包整理資料](https://www.jianshu.com/p/cf3b30183b32)
[ggplot2回顧(14): 繪圖函式--以平行座標圖為例](https://www.jianshu.com/p/34c36a15e0e8)
> 因水平有限,有錯誤的地方,歡迎批評