简介
最近自己论文中需要绘制不同公式得到结果的分面图,并且在标签中给出表达式。对于这样的需求,一时半会想不出来。经过一顿搜索,得到了以下不错的解决方案[1]。
关于分面的基础教程可见以前写的推文:R可视乎|分面一页多图。拓展的技巧可见:ggplot 分面的细节调整汇总。老俊俊的生信笔记也给出了几篇不错的分面技巧介绍:使用 jjAnno 对分面添加注释;ggplot2 如何在不同分面添加不同文字;ggplot2 如何在不同分面添加不同图形。
构建模拟数据
老样子,给出模拟数据,读者根据自己数据进行转换即可。
# 相关包 library(ggplot2) library(grid) mydf <- data.frame(letter = factor(rep(c("A", "B", "C", "D"), each = 20)), x = rnorm(80), y = rnorm(80)) head(mydf)
基本绘图
简单绘制出数据 x,y 之间的散点图和拟合曲线,并根据分类数据 letter 进行分面。
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter)
设置表达式标签
使用 expression()
函数定义表达式标签,存储到 f_names
。并定义 f_labeller
提取 f_names
中的值。之后在分面中使用参数 labeller = f_labeller
。
当然,也可以使用
latex2exp
包中的TeX()
, 用类似 LeTeX 语句写表达式。例如:TeX("$\\alpha_2$")
。
f_names <- list('A' = expression(paste(alpha[2])), 'B' = expression(Gamma(3,4)), 'C' = expression(paste(y = beta[0] + beta[1]*x[1])), 'D' = expression(delta)) f_labeller <- function(variable, value){return(f_names[value])} ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, labeller = f_labeller)
修改主题
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm",color = "#e99e9c",fill = "#98c0d7") + geom_point(color = "gray60") + facet_wrap(~ letter, labeller = f_labeller,scales = "free") + theme_bw() + ylab("Value") + xlab("Time") + #主题设置 theme(panel.grid = element_blank(), strip.background = element_blank())
添加中文标签
加入想要添加中文标签,只需修改:
# 设置标签 f_names <- list('A' = "庄闪闪", 'B' = "庄亮亮", 'C' = "庄晶晶", 'D' = "庄暗暗")
如果存在中文字体乱码,请参考这篇推文:R问题|解决PDF导出字体无法显示的问题。即在文中前面加入以下代码:
library(showtext) showtext.auto()
此时绘制出来的结果如下:
参考资料
[1]