You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:27:22