R语言ggplot2 facet分面标签如何添加化学式下标
问题原因
直接给factor()的labels参数传入expression对象无法实现分面标签下标渲染,核心原因有两个:
- 因子的标签仅支持存储纯文本内容,传入的expression会被强制转换为普通字符串,plotmath语法不会被识别
- 原有expression写法将带
[3]下标的内容整体包裹在引号内,即使渲染逻辑正确,引号内的内容也会被判定为普通文本,不会触发下标解析
可行方案
方案1:基础ggplot2实现(无需安装额外包)
不要提前在数据列中存储expression,改为在分面时通过labeller参数传入命名的表达式标签向量,注意expression的写法:下标部分不要放在引号内,用~表示空格。
# 定义匹配参数名的标签向量,名称对应数据中Parameter列的原始值 facet_labs <- c( "Alkalinity" = " Alkalinity", "Ca (CaCO3)" = "Ca (CaCO3)", "Cl(mg/l)," = "Cl (mg/l)", "Conductivity (mS/m)" = "Conductivity (mS/m)", "Cu (mg/l)" = "Cu (mg/l)", "F (mg/l)" = "F (mg/l)", "Fe (mg/l)" = "Fe (mg/l)", "K (mg/l" = "K (mg/l)", "Mg (CaCO3)" = "Mg (CaCO3)", " Mn(mg/l)" = "Mn (mg/l)", "Na (mg/l)" = "Na (mg/l)", "NO3" = expression(NO[3]~(mg/l)), "pH" = "pH", "SiO2" = expression(SiO[2]~(mg/l)), "SO4" = expression(SO[4]~(mg/l)), "TDS (TDS Calculated)" = "TDS (TDS Calculated)", "Turbidity (NTU)" = "Turbidity (NTU)", "Zn (mg/l)" = "Zn (mg/l)" ) # 绘图时直接使用原始Parameter列分面,指定labeller library(ggplot2) ggplot(na.omit(NewDat1), aes(Year, Value, color = Location)) + geom_line() + geom_point() + facet_wrap(~Parameter, scales = "free_y", labeller = labeller(Parameter = facet_labs))
注意:需要保证命名向量的名称和数据里Parameter列的参数值完全匹配,否则标签会映射失败,建议提前修正数据里Parameter列的笔误(比如
"K (mg/l"缺少右括号、"Cl(mg/l),"多了逗号)。
方案2:ggtext包实现(语法更简单)
如果不想记忆plotmath的expression语法,可以使用ggtext包,直接用markdown的下标语法~下标内容~写标签,配置主题让分面标题支持markdown渲染即可,写法更不容易出错。
# 首次使用先安装:install.packages("ggtext") library(ggtext) # 用markdown语法定义标签,不需要写expression facet_labs_md <- c( "Alkalinity" = " Alkalinity", "Ca (CaCO3)" = "Ca (CaCO3)", "Cl(mg/l)," = "Cl (mg/l)", "Conductivity (mS/m)" = "Conductivity (mS/m)", "Cu (mg/l)" = "Cu (mg/l)", "F (mg/l)" = "F (mg/l)", "Fe (mg/l)" = "Fe (mg/l)", "K (mg/l" = "K (mg/l)", "Mg (CaCO3)" = "Mg (CaCO3)", " Mn(mg/l)" = "Mn (mg/l)", "Na (mg/l)" = "Na (mg/l)", "NO3" = "NO~3~ (mg/l)", "pH" = "pH", "SiO2" = "SiO~2~ (mg/l)", "SO4" = "SO~4~ (mg/l)", "TDS (TDS Calculated)" = "TDS (TDS Calculated)", "Turbidity (NTU)" = "Turbidity (NTU)", "Zn (mg/l)" = "Zn (mg/l)" ) ggplot(na.omit(NewDat1), aes(Year, Value, color = Location)) + geom_line() + geom_point() + facet_wrap(~Parameter, scales = "free_y", labeller = labeller(Parameter = facet_labs_md)) + # 配置分面标题使用markdown渲染 theme(strip.text = element_markdown())
效果说明
两种方案都可以正确渲染NO₃、SiO₂、SO₄这类化学符号下标,第二种方案除了下标外还支持上标、字体颜色、加粗等更丰富的格式,适合更复杂的标签需求。
内容的提问来源于stack exchange,提问作者Ndahambelela
相关产品推荐
相关产品推荐

