如何在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")
已尝试方案(未生效)
- 定义标签映射
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']) ))
- 直接在
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
相关产品推荐
相关产品推荐

