先前我介紹過ggrepel 這個包:[[67-R可視化11-用ggrepel更加美觀的添加標記(火山圖的實現)]]
其實現的文本標記更加美觀,且個性化程度遠遠優於:[[66-R可視化10-自由的在ggplot上添加文本(柱狀圖加計數)]]
那麼我們可不可以直接指哪打哪,連代碼都不用呢?
基於shiny 的easylabel 包或許是你的選擇。
這裡我以火山圖為例。
1-準備工作加載包、製作假數據:
my_packages<- c("RColorBrewer", "paletteer", "ggplot2",
"ggpubr", "tidyverse", "ggrepel", "devout",
"ggforce", "easylabel")
tmp <- sapply(my_packages, function(x) library(x, character.only = T)); rm(tmp, my_packages)
# make fake data
DEG <- data.frame(
genes = paste0("gene", 1:100),
fold_change = round(runif(100, -10, 10), 2),
P_value = runif(100, 0.001, 0.1)
)
DEG$group <- ifelse((DEG$P_value > 0.05) | (abs(DEG$fold_change) < 2) , "no-Significant",
ifelse(DEG$fold_change > 2, "increase", "decrease"))
DEG$group <- factor(DEG$group, levels = c("decrease", "no-Significant",
"increase"))
sig_DEG <- DEG[!DEG$group %in% "no-Significant",]
2-直接操作easylabel開始我以為,這個包會像ggthemeassistant 一樣,直接操作繪圖對象p,直接修改代碼,更加方便且個性化。
沒想到,它是需要直接以數據框操作的。
這裡因為以火山圖為例,先使用火山圖繪圖函數easyVolcano :需要注意這裡的數據框的行名需要是基因名
# 開始之前修改一下數據框
DEG$new_P <- -log10(DEG$P_value)
easylabel(DEG)
rownames(DEG) <- DEG$genes
easyVolcano(DEG, x = "fold_change",
y = "P_value",
fccut = 1, fdrcutoff = 0.05,
ylim = c(0, 6), xlim = c(-5, 5),
colScheme = colScheme,
vline = c(-1, 1))這裡參數分別表示:
fccut 是fold change 閾值,也是x軸;xlim 同上,超過這兩個邊界的點會被標記為outlier;vline 標記y 軸線段,用於分割結果,類似之前的geom_hline 操作;接下來我們就可以在shiny 中交互添加了:
在shiny 界面,你還可以對標籤的位置進行個性化設置:
此外,除了在圖上標記,還有一個非常有意思的篩選框,你可以通過輸入基因名的方式標記:
還有一個非常簡單的shiny 數據模塊:
3-導出結果官方支持多種導出格式:
這裡我嘗試直接pdf:
你們覺得好看嗎?
4-拓展內容其實不止這一個函數,官方提供了:
等多個例子。
直接參考:easylabel (r-project.org)[2] 官方教程啦。
個人覺得,如果這個包可以直接給出繪圖代碼就好了,或者直接操作ggplot 對象,畢竟我對這種封裝的美觀體驗,還是有要求的,你怎麼知道你的繪圖代碼就能讓我滿意呢?
不過話說回來,這個包的一些繪圖細節,比如火山圖,還蠻值得學習的:
比如這個的小操作,還是蠻對我胃口的:
參考資料[1]easylabel (r-project.org): https://cran.r-project.org/web/packages/easylabel/vignettes/easylabel.html
[2]easylabel (r-project.org): https://cran.r-project.org/web/packages/easylabel/vignettes/easylabel.html