将图例标签改为在分面数据上包含下标和上标表达式

编程语言 2026-07-09

我想在一个带分面的ggplot上修改标签。新标签中包含下标和上标。我在Stack Overflow上看过类似的问题,但我的代码里有问题,需要帮忙把它找出来。

先说第一点,下面是数据框和代码本身的概要:

'data.frame':   99 obs. of  12 variables:
 $ Sample: chr  "A-HCl" "A-HCl" "A-HCl" "A-HCl" ...
 $ Mill  : chr  "Aspa" "Aspa" "Aspa" "Aspa" ...
 $ Acid  : chr  "HCl" "HCl" "HCl" "HCl" ...
 $ Step  : num  0 1 2 3 4 5 6 7 8 9 ...
 $ pH    : num  11.55 10.31 8.7 7.67 7.77 ...
 $ Na    : num  6097 5991 5819 5921 6043 ...
 $ Mg    : num  0.405 22.524 333.229 553.882 879.715 ...
 $ Al    : num  0.446 0.459 0.525 0.508 0.503 ...
 $ K     : num  549 505 501 515 536 ...
 $ Ca    : num  2.17 1.68 94.49 676.56 1082.46 ...
 $ Mn    : num  0.0188 0.0058 0.1296 0.9737 6.0996 ...
 $ Fe    : num  0.0517 0.0379 0.0327 0.0332 0.0234 ...

myplot<-
  ggplot(gather(Maj.plot, key=Element, value="value", -"Step", -"Sample", -"Mill", -"pH", -"Acid"),
         aes(x=pH, y=as.numeric(value), colour=Acid, group=Sample, shape=Mill) )  + 
  geom_point() +
  geom_line()+
  facet_wrap(~ Element, scales = "free") +
  scale_x_continuous(breaks = seq(0, 10, 2))+
  theme_bw()

它生成了如下漂亮的图形:

一个很棒的图,但标签错了

但我想做的是把颜色标签从HCl、H2SO4和 Fe-SO4改为HCl、H2SO4和 Fe2+ + H2SO4。本质上这是这个表达式:

"HCl", bquote("H"[2]*"SO"[4]),bquote("Fe"^"2+"+"H"[2]*"SO"[4])

我尝试过的(参考StackOverflow上的类似示例):

  • 在geom_point中设置aes:没有任何反应(也就是ggplot忽略了它)
  • 在geom_line中设置aes:没有任何反应(也就是ggplot忽略了它)
  • 使用scale_colour_manual( labels = c("HCl", bquote("H"[2]*"SO"[4]),bquote("Fe"^"2+"+"H"[2]*"SO"[4]) ): 得到错误 “Insufficient values in manual scale. 3 needed but only 0 provided”
  • 使用scale_colour_manual( names= c("HCl", "H2SO4", "Fe-SO4"), labels = c("HCl", bquote("H"[2]*"SO"[4]),bquote("Fe"^"2+"+"H"[2]*"SO"[4]) )):得到错误 " Error in discrete_scale(aesthetic, "manual", pal, breaks = breaks, limits = limits, :
    unused argument (names = c("HCl", "H2SO4", "Fe-SO4"))"
  • 把新标签存入向量并在scale_colour_manual的不同测试中把向量作为names或 labels使用:出现错误,但记不清楚是unused argument还是insufficient values,可能两者都有。

我通过使用scale_colour_manual( values = c("blue", "green", "red"), labels = c("HCl", bquote("H"[2]*"SO"[4]),bquote("Fe"^"2+"+"H"[2]*"SO"[4]) )) 来让它工作了,但这会改变实际使用的颜色(这不是我想要的,因为我希望所有图的颜色保持一致)。所以问题似乎在于我不能告诉ggplot将标签设在哪些颜色上。

我到底在做错什么?如果不是names和 values,正确的参数应该是什么?

解决方案

为了保持ggplot2的“默认”颜色方案,一种潜在的做法是通过 scale_colour_hue() 为颜色标尺指定 'labels'(使用内置的mtcars数据集):

mtcars %>%
  ggplot(aes(x=disp, y=hp, colour=factor(cyl),
             group = factor(cyl), shape=factor(gear))) +
  geom_point() +
  geom_line() +
  facet_wrap(~ carb, scales = "free") +
  theme_bw() +
  scale_colour_hue(labels = c("4" = "HCL",
                                 "6" = bquote("H"[2]*"SO"[4]),
                                 "8" = bquote("Fe"^"2+"+"H"[2]*"SO"[4])))

示例2.png

创建于2026-06-02,使用 reprex v2.1.1.9000

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章