参考:
- easylabel (r-project.org)[1]
前言
先前我介绍过ggrepel 这个包:[[67-R可视化11-用ggrepel更加美观的添加标记(火山图的实现)]]
其实现的文本标记更加美观,且个性化程度远远优于:[[66-R可视化10-自由的在ggplot上添加文本(柱状图加计数)]]
那么我们可不可以直接指哪打哪,连代码都不用呢?
基于shiny 的easylabel 包或许是你的选择。
这里我以火山图为例。
1-准备工作
加载包、制作假数据:
代码语言:javascript复制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 :需要注意这里的数据框的行名需要是基因名
代码语言:javascript复制# 开始之前修改一下数据框
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轴;
- fdrcutoff 是P 的阈值,也是y轴;
- ylim 是整个坐标轴y 的边界范围;
- xlim 同上,超过这两个边界的点会被标记为outlier;
- colScheme 为指定的颜色版;
- 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