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

如何在R绘图中程序化生成带希腊符号的X轴刻度标签?

程序化生成带希腊符号的坐标轴刻度标签

Base R 实现方案

无需手动编写expression向量,可通过parse()结合字符串拼接,或bquote()动态生成刻度标签:

方法1:使用parse()解析字符串

先构造包含希腊符号语法的字符串,再通过parse()转换为表达式对象,适配任意刻度值:

n = 1e6
d_norm <- rnorm(n)
d_norm_den <- density(d_norm)

plot(d_norm_den, ylab = NA, lwd = 3, main = NA, xlab = NA, xaxt = "n")
mtext(text = "Empirical Rule", side = 3, line = 2, cex = 2, font = 4)
mtext(text = "(Normal distribution)", side = 3, line = 0.5, cex = 1.25, font = 1)

# 定义刻度位置
at_vals <- seq(-3, 3)
# 动态生成标签字符串
label_strs <- ifelse(at_vals == 0, "mu",
                     ifelse(at_vals > 0, paste0("mu + ", abs(at_vals), "*sigma"),
                            paste0("mu - ", abs(at_vals), "*sigma")))
# 解析为表达式
labels <- parse(text = label_strs)
# 绘制坐标轴
axis(side = 1, at = at_vals, labels = labels)

方法2:使用bquote()构造表达式

bquote()支持插入变量值,适合需要更灵活表达式的场景:

n = 1e6
d_norm <- rnorm(n)
d_norm_den <- density(d_norm)

plot(d_norm_den, ylab = NA, lwd = 3, main = NA, xlab = NA, xaxt = "n")
mtext(text = "Empirical Rule", side = 3, line = 2, cex = 2, font = 4)
mtext(text = "(Normal distribution)", side = 3, line = 0.5, cex = 1.25, font = 1)

at_vals <- seq(-3, 3)
# 用sapply遍历每个刻度值生成表达式
labels <- sapply(at_vals, function(x) {
  if (x == 0) {
    bquote(mu)
  } else if (x > 0) {
    bquote(mu + .(x)*sigma)
  } else {
    bquote(mu - .(abs(x))*sigma)
  }
})

axis(side = 1, at = at_vals, labels = labels)

ggplot2 实现方案

在scale_x_continuous()中通过自定义labels函数动态生成带希腊符号的标签:

library(ggplot2)

n = 1e6
d_norm <- rnorm(n)
d_norm_den <- density(d_norm)
df <- data.frame(x = d_norm_den$x, y = d_norm_den$y)

ggplot(df, aes(x, y)) +
  geom_line(lwd = 3) +
  labs(title = "Empirical Rule",
       subtitle = "(Normal distribution)",
       x = "", y = "") +
  scale_x_continuous(
    breaks = seq(-3, 3),
    labels = function(x) {
      # 生成标签字符串并解析
      label_strs <- ifelse(x == 0, "mu",
                           ifelse(x > 0, paste0("mu + ", abs(x), "*sigma"),
                                  paste0("mu - ", abs(x), "*sigma")))
      parse(text = label_strs)
    }
  ) +
  theme(
    plot.title = element_text(size = 20, face = "bold", margin = margin(b = 10)),
    plot.subtitle = element_text(size = 15),
    axis.text.x = element_text(size = 12)
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:36:16