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

ggplot添加化学符号与单位时上标异常问题求助

解决ggplot2中y轴标签化学符号与单位的上标问题

嗨,这个问题我之前也碰到过!ggplot里的表达式语法确实容易踩这个小坑——主要是没把上标内容和后面的单位正确分隔开,导致括号被意外包含进上标里。给你两种靠谱的解决方法,选你顺手的来:

方法1:用base R的expression()函数(无需额外包)

在expression()里,下标用[],上标用^,关键是要把上标的负号单独处理(或用分隔符和后面的单位断开),避免括号被误纳入上标范围。

示例代码:

library(ggplot2)
# 你的数据示例
dat <- as.data.frame(matrix(runif(100), 2, 10))
colnames(dat) <- paste("Sample", 1:10)
dat$Group <- c("A", "B")
# 转成长格式方便绘图
dat_long <- tidyr::pivot_longer(dat, -Group, names_to = "Sample", values_to = "Concentration")

ggplot(dat_long, aes(x = Sample, y = Concentration, fill = Group)) +
  geom_boxplot() +
  # 用~分隔上标和单位,确保括号正常显示
  ylab(expression("硝酸根浓度: "~NO[3]^"-"~(mg/L)))

解释:~在expression里代表空格,把NO[3]^"-"和后面的(mg/L)分成两个独立部分,就不会让括号变成上标了。如果上标是多个字符,记得用{}包裹,比如NO[3]^{"-"}。

方法2:用ggtext包的markdown/html语法(更直观)

如果你觉得expression的语法太绕,ggtext支持直接用html标签来写上下标,非常直观,不容易出错。

示例代码:

library(ggplot2)
library(ggtext) # 需要先安装:install.packages("ggtext")

# 你的数据示例
dat <- as.data.frame(matrix(runif(100), 2, 10))
colnames(dat) <- paste("Sample", 1:10)
dat$Group <- c("A", "B")
dat_long <- tidyr::pivot_longer(dat, -Group, names_to = "Sample", values_to = "Concentration")

ggplot(dat_long, aes(x = Sample, y = Concentration, fill = Group)) +
  geom_boxplot() +
  # 直接用<sub>写下标,<sup>写上标
  ylab("硝酸根浓度: NO<sub>3</sub><sup>-</sup> (mg/L)") +
  # 关键:把y轴标题设置为markdown格式
  theme(axis.title.y = element_markdown())

这种方法完全不需要记expression的特殊语法,像写普通文本一样用html标签标记上下标即可,新手友好度拉满。

另外,不需要把负号放进括号里哦,两种方法都能完美实现你要的“NO₃⁻”格式,同时让后面的单位正常显示。

内容的提问来源于stack exchange,提问作者Lmm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:22:52