R繪圖(2): 離散/分類變量如何畫熱圖/方塊圖

相信不少人都看到過上面這種方塊圖,有點像「華夫餅圖」的升級版,也有點像「熱圖」的離散版。我在一些臨牀多組學的文章裏面看到過好幾回這種圖,用它來展現病人的臨牀信息很是合適,我本身也用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,最終的數據格式以下:3d

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函數code

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。(這種方法在實際畫圖中,常常用到)blog

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配色方案element

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")

圖中右側的圖例並非咱們想要的,這時還須要用AI稍微編輯一下,最後的效果以下:get


關於ggplot2的學習,我以前整理了幾篇筆記,感興趣的小夥伴能夠點擊下面的連接進行閱讀
ggplot2回顧(1): 認識ggplot2
ggplot2回顧(2): 圖層語法入門
ggplot2回顧(3): 圖層語法基礎
ggplot2回顧(4): 瓦片圖、多邊形圖
ggplot2回顧(5): 數據分佈的展現
ggplot2回顧(6): ColorBrewer配色方案
ggplot2回顧(7): geom_bar()和 geom_histogram()比較
ggplot2回顧(8): 標度
ggplot2回顧(9): 分面
ggplot2回顧(10): 座標系
ggplot2回顧(11): 主題設置
ggplot2回顧(12): 一頁多圖
ggplot2回顧(13): 使用plyr包整理數據
ggplot2回顧(14): 繪圖函數--以平行座標圖爲例it

因水平有限,有錯誤的地方,歡迎批評指正!入門

相關文章
相關標籤/搜索