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

如何在ggplot龙卷风图中设置含希腊字母与下标的变量名

自定义龙卷风图变量名称:插入下标与希腊字母的解决方案

需求

将龙卷风图的Y轴变量名称改为带下标(如a₂)和真实希腊字母(如β)的格式,替代当前纯文本的下划线形式(如a_2、beta_2)。

现有绘图代码

plot_sa<-ggplot()+
  geom_bar(data = fig_sa_tot %>% 
             filter(sa_val =="total"), 
           aes(y=reorder(parameters, estimate), x=estimate, fill='total'), 
           stat = "identity")+
  geom_bar(data = fig_sa_tot %>% 
             filter(sa_val =="first"), 
           aes(y=parameters, x=estimate, fill='first'),
           stat = "identity")+
  theme_bw()+
  theme(axis.title.y = element_blank(),
        legend.title = element_blank(),
        legend.position = "bottom")

已尝试方案(未生效)

  1. 定义标签映射my_y_labels,使用bquote和expression生成表达式:
my_y_labels<-setNames(c("a_2",
                        "p_uplift",
                        "P_hysp",
                        "N_2",
                        "beta_2",
                        "mu_2",
                        "a_1",
                        "mu_1",
                        "beta_1",
                        "N_1",
                        "beta_vh",
                        "r_c",
                        "sigma",
                        "d_c",
                        "d_s",
                        "viro_1",
                        "r_s",
                        "viro_2"),
                      c(bquote(a['2']),
                        bquote(p[uplift]),
                        bquote(p[hysplit]),
                        bquote(N['2']),
                        expression(beta['2']),
                        expression(mu['2']), 
                        bquote(a['1']), 
                        expression(mu['1']),
                         expression(beta['1']),
                        bquote(N['1']),
                        expression(beta[vh]),
                        bquote(r[c]),
                        expression(sigma),
                        bquote(d[c]),
                        bquote(d[s]),
                        expression(omega['1']),
                         bquote(r[s]),
                        expression(omega['2'])
                        ))
  1. 直接在scale_y_discrete中传入表达式标签:
plot_sa <- ggplot()+
  geom_bar(data = fig_sa_tot %>% 
             filter(sa_val =="total"), 
           aes(y=reorder(parameters, estimate) , x=estimate, fill='total'),
           stat = "identity")+
  geom_bar(data = fig_sa_tot %>% 
             filter(sa_val =="first"), 
           aes(y=parameters,x=estimate,fill='first'),
           stat = "identity")+  
  scale_y_discrete(c('a_2'=bquote(a['2']),
                        'p_uplift'=bquote(p[uplift]),
                        'P_hysp'=bquote(p[hysplit]),
                        'N_2'=bquote(N['2']),
                        'beta_2'=expression(beta['2']),
                        'mu_2'=expression(mu['2']),
                        'a_1'= bquote(a['1']),
                        'mu_1'=expression(mu['1']),
                        'beta_1'= expression(beta['1']),
                        'N_1'=bquote(N['1']),
                        'beta_vh'=expression(beta[vh]),
                        'r_c'= bquote(r[c]),
                        'sigma'=expression(sigma),
                        'd_c'=bquote(d[c]),
                        'd_s'=bquote(d[s]),
                        'viro_1'=expression(omega['1']),
                        'r_s'=bquote(r[s]),
                        'viro_2'= expression(omega['2'])
                     ))+
  theme_bw()+
  theme(axis.title.y = element_blank(),
        legend.title = element_blank(),
        legend.position = "bottom")

解决方法

核心问题是未启用ggplot的表达式解析功能,结合plotmath语法字符串和parse=TRUE参数即可实现需求,同时确保因子顺序与标签对应:

步骤1(可选):固定因子水平顺序

先将parameters列转换为有序因子,避免reorder打乱标签对应关系:

fig_sa_tot <- fig_sa_tot %>%
  mutate(parameters = factor(parameters, levels = c("a_2", "p_uplift", "P_hysp", "N_2", "beta_2", "mu_2", "a_1", "mu_1", "beta_1", "N_1", "beta_vh", "r_c", "sigma", "d_c", "d_s", "viro_1", "r_s", "viro_2")))

步骤2:修改绘图代码,添加带解析的标签映射

使用plotmath语法字符串(如"a[2]"对应a₂,"beta[2]"对应β₂),并设置parse=TRUE让ggplot解析这些表达式:

plot_sa <- ggplot() +
  geom_bar(data = fig_sa_tot %>% filter(sa_val == "total"),
           aes(y = reorder(parameters, estimate), x = estimate, fill = 'total'),
           stat = "identity") +
  geom_bar(data = fig_sa_tot %>% filter(sa_val == "first"),
           aes(y = parameters, x = estimate, fill = 'first'),
           stat = "identity") +
  scale_y_discrete(
    labels = c(
      "a_2" = "a[2]",
      "p_uplift" = "p[uplift]",
      "P_hysp" = "p[hysplit]",
      "N_2" = "N[2]",
      "beta_2" = "beta[2]",
      "mu_2" = "mu[2]",
      "a_1" = "a[1]",
      "mu_1" = "mu[1]",
      "beta_1" = "beta[1]",
      "N_1" = "N[1]",
      "beta_vh" = "beta[vh]",
      "r_c" = "r[c]",
      "sigma" = "sigma",
      "d_c" = "d[c]",
      "d_s" = "d[s]",
      "viro_1" = "omega[1]",
      "r_s" = "r[s]",
      "viro_2" = "omega[2]"
    ),
    parse = TRUE  # 关键参数:启用表达式解析
  ) +
  theme_bw() +
  theme(axis.title.y = element_blank(),
        legend.title = element_blank(),
        legend.position = "bottom")

原理说明

  • ggplot默认将labels视为纯文本,parse=TRUE会触发plotmath解析,将字符串转换为数学表达式(包括下标、希腊字母)。
  • plotmath语法简单直观:用[]包裹下标内容,希腊字母直接写英文名称(如beta对应β,sigma对应σ)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:13:08