如何在ggplot2 facet标签中使用含δ、上标、千分号的数学表达式
解决方法
要在facet_grid的y轴分面标签中实现δ符号、数字上标和千分号效果,有两种简洁的实现方式:
方法一:提前修改数据中的标签(推荐)
先将数据里的variable列转换为支持plotmath语法的表达式,再让ggplot解析这些表达式:
- 加载处理数据的包(如果未加载):
library(dplyr) library(stringr)
- 修改
group.data的variable列:
group.data <- group.data %>% mutate(variable = case_when( variable == "d13C" ~ expression(delta^{13}*C~(‰)), variable == "d15N" ~ expression(delta^{15}*N~(‰)), variable == "d34S" ~ expression(delta^{34}*S~(‰)), # 如果有其他变量,保留原标签 TRUE ~ as.expression(variable) ))
- 在
facet_grid中指定解析标签的函数:
将原代码中的facet_grid行替换为:
facet_grid(variable ~ Species, scales = "free_y", labeller = label_parsed)
方法二:直接在facet中用自定义标签解析器
无需修改原始数据,直接通过labeller函数动态转换标签:
将原代码中的facet_grid行替换为:
facet_grid(variable ~ Species, scales = "free_y", labeller = labeller(variable = function(x) { # 替换d为delta,给数字加上标,添加千分号 parsed_labels <- str_replace(x, "d(\\d+)(.)", "delta^{\\1}\\2~(‰)") # 解析为plotmath表达式 parse(text = parsed_labels) }))
修改后的完整脚本
library(ggplot2) library(dplyr) library(stringr) # 方法一的完整代码(先修改数据) group.data <- group.data %>% mutate(variable = case_when( variable == "d13C" ~ expression(delta^{13}*C~(‰)), variable == "d15N" ~ expression(delta^{15}*N~(‰)), variable == "d34S" ~ expression(delta^{34}*S~(‰)), TRUE ~ as.expression(variable) )) group.violin<-ggplot(group.data, aes(x=Culture2, group = Culture2, y=value)) + stat_summary(aes(x = Culture2, y = value, color= Species, group = Species), fun = "mean", geom = "line", lwd = 2, alpha = 0.5)+ stat_summary(geom="point")+ geom_violin(aes(x = Culture2, y = value, fill = Species), alpha = 0.4, color = NA)+ geom_point(aes(x = Culture2, y = value, fill = Species), size = 3, color = "black", pch = 21, position = position_jitter(width = 0.05, seed = 12))+ facet_grid(variable ~ Species, scales = "free_y", labeller = label_parsed) + xlab("")+ ylab("")+ theme_classic()+ theme(strip.background = element_rect(colour = "black", fill = "grey85", size = 0.1), panel.border=element_rect(colour="black",size = 0.1, fill = NA), panel.spacing = unit(0.3, "lines"), axis.text.y = element_text(size = 12, colour = "black"), axis.title.x = element_blank(), axis.title.y = element_blank(), legend.position = "bottom", legend.text=element_text(size=12, face="italic"), legend.title=element_text(size=12,face="bold"), strip.text.x=element_text(size=12,face="bold.italic"), strip.text.y=element_text(size=12,face="bold"))
内容的提问来源于stack exchange,提问作者Marco ViCo
相关产品推荐
相关产品推荐

