如何在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
相关产品推荐
相关产品推荐

