如何在R的ggplot2分面标签中添加下标?
ggplot2分面标签添加下标格式的解决方案
问题背景
原代码可生成Year = 2009这类分面标签,现在需要将标签修改为带下标的格式(例如Year a<sub>b</sub> = 2009),但直接使用bquote的尝试失败。
原代码:
set.seed(1) df=data.frame(year=rep(2009:2013,each=4), quarter=rep(c("Q1","Q2","Q3","Q4"),5), sales=40:59+rnorm(20,sd=5)) library(ggplot2) ggplot(df) + geom_line(aes(x=quarter,y=sales,group=year))+ facet_wrap( .~year, labeller = as_labeller(\(x) paste0("Year=", x)), strip.position = "top", scales = "free") + theme( strip.placement = "outside", axis.title.x=element_blank(), legend.position="none" )
解决方案
方法1:使用ggplot内置的表达式解析
利用as_labeller的parse = TRUE参数,将带表达式语法的字符串解析为下标格式:
set.seed(1) df=data.frame(year=rep(2009:2013,each=4), quarter=rep(c("Q1","Q2","Q3","Q4"),5), sales=40:59+rnorm(20,sd=5)) library(ggplot2) ggplot(df) + geom_line(aes(x=quarter,y=sales,group=year))+ facet_wrap( .~year, # 用~分隔元素,[b]表示下标,parse=TRUE会自动解析表达式语法 labeller = as_labeller(\(x) paste0("Year~a[b]~=", x), parse = TRUE), strip.position = "top", scales = "free" ) + theme( strip.placement = "outside", axis.title.x=element_blank(), legend.position="none" )
方法2:使用ggtext包支持HTML格式
如果更习惯HTML的<sub>标签语法,可以借助ggtext包实现,需要开启分面文本的markdown解析:
set.seed(1) df=data.frame(year=rep(2009:2013,each=4), quarter=rep(c("Q1","Q2","Q3","Q4"),5), sales=40:59+rnorm(20,sd=5)) library(ggplot2) library(ggtext) ggplot(df) + geom_line(aes(x=quarter,y=sales,group=year))+ facet_wrap( .~year, labeller = as_labeller(\(x) paste0("Year a<sub>b</sub> = ", x)), strip.position = "top", scales = "free" ) + theme( strip.placement = "outside", axis.title.x=element_blank(), legend.position="none", # 开启分面文本的markdown/HTML解析功能 strip.text = element_markdown() )
失败原因说明
之前使用bquote(a[b])的方法无效,是因为bquote返回的是语言对象,直接和字符串拼接会被转为普通字符(如"a[b]"),ggplot不会自动解析该格式,必须通过表达式解析器或markdown渲染器才能将其转换为下标样式。
内容的提问来源于stack exchange,提问作者Dovini Jayasinghe
相关产品推荐
相关产品推荐

