ggplot2中多个图例中的下标

6
为了使我的图像适合黑白打印,我将一个变量与“形状”、“线型”和“颜色”一起映射。
ggplot(df, aes(x=time, y=mean, 
               shape=quality, 
               lty=quality,
               color=quality))

我得到的图像如下: enter image description here 我想把部分图例作为订阅,代码如下:
labels=c(expression(Pol[(Art)]), expression(Pol['(Aca-)']), expression(Pol['(Aca-)']))

很不幸的是,当我将“标签”设置为颜色或形状时,会使图例变得非常复杂,如下图所示:

enter image description here

是否有可能将“形状”、“颜色”、“线型”映射到一个变量,并设置下标,但仍保持在同一组图例中?


我认为你应该将标签作为参数提供给scale_colour_discrete,而不是作为额外的美学元素?但是,一个可重现的例子会有所帮助 - 我们无法看到你正在做什么。 - Calum You
@CalumYou,非常感谢,scale_*_discrete可行! - Jellz
1个回答

7
改变分类刻度的标签,您可以使用scale_*_discrete(labels = ...)。在这里,您只需要对colorshapelinetype进行操作。
通常应避免使用lty=;该同义词仅用于与基本R的兼容性,但它并不普遍支持ggplot2
我更改了您的标签,使其更接近您的意思(第三个条目现在是"Aca+"而不是"Aca-"的重复),并使它们左对齐更好(通过向第一个添加一个不可见的"+"来创建适当的间距)。
lab1 <- c(expression(Pol[(Art)*phantom("+")]),
          expression(Pol['(Aca-)']), 
          expression(Pol['(Aca+)']))

library(ggplot2)

ggplot(mtcars, 
       aes(wt, mpg, 
           color = factor(cyl), 
           shape = factor(cyl), 
           linetype = factor(cyl))) +
  geom_point() +
  stat_smooth(se = F) +
  scale_color_discrete(labels = lab1) +
  scale_shape_discrete(labels = lab1) +
  scale_linetype_discrete(labels = lab1)

enter image description here

如果你发现自己需要重复粘贴这样完全相同的函数,有两种解决方法:

  1. 重新标记数据本身 - 或者 -

  2. 使用 purrr::invoke_map 迭代函数


library(purrr)

ggplot(mtcars, 
       aes(wt, mpg, 
           color = factor(cyl), 
           shape = factor(cyl), 
           linetype = factor(cyl))) +
  geom_point() +
  stat_smooth(se = F) +
  invoke_map(list(scale_color_discrete, 
                  scale_linetype_discrete, 
                  scale_shape_discrete),
             labels = lab1)

更新:

这种方法大多数情况下都可以,但现在expression(...)语法有一种更优秀的选择,那就是基于Markdown的出色{ggtext}包:https://github.com/wilkelab/ggtext

要改用此方法,请使用一个(可选的)标签向量,看起来像这样:

library(ggtext)

lab1 <- c(
  `4` = "Pol<sub>(Art)</sub>",
  `6` = "Pol<sub>(Aca-)</sub>", 
  `8` = "Pol<sub>(Aca+)</sub>"
)

然后将以下这行代码添加到你的主题中:
  ... +
  theme(
    legend..text = element_markdown()
  )

优点如下:
  1. 相对于其他方法,Markdown语法更容易在线寻求帮助
  2. 现在这些标签可以作为一列存储在实际数据中,而不是分别传递给每个geom
您可以使用新的列作为您的美学映射 [ggplot(..., aes(color = my_new_column, linetype = my_new_column, ...)],而不是使用purrr::invoke方法在每个层中传递额外的标签。

非常感谢!这对我来说完美无缺!非常感激您的热心帮助 :) - Jellz
2
要将特定标签值映射到新标签,您可以使用:lab1 <- c("myTextualLabelFieldValue" = expression(my^{fancy}[label]), ... ) - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接