ggplot2中多个图例中的下标

Subscript in multiple legends in ggplot2

为了让我的图适合黑白打印,我把"shape"、"lty"、"color"映射了一个变量。

ggplot(df, aes(x=time, y=mean, 
               shape=quality, 
               lty=quality,
               color=quality))

我得到了这样的数字, 我想将部分图例设为订阅,代码为:

labels=c(expression(Pol[(Art)]), expression(Pol['(Aca-)']), expression(Pol['(Aca-)']))

不幸的是,当我把 "label" 放在颜色或形状中时,它使图例变得非常复杂,例如,

是否可以将"shape"、"color"、"lty"映射到一个变量,并设置下标,但将它们保留在一组图例中?

要更改分类量表的标签,请使用 scale_*_discrete(labels = ...)。在这里,您只需要为 colorshapelinetype.

执行此操作

你一般应该避免使用lty =;该同义词允许与基本 R 兼容,但在 ggplot2.

中并未得到普遍支持

我更改了您的标签,使其更接近您的意思(第三个条目现在是“Aca+”而不是“Aca-”的重复)并使它们 left-align 更好(通过添加一个不可见的“+”到第一个以创建适当的间距)。

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)

如果您发现自己需要像这样重复一个函数的精确副本,有两个解决方法:

  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-based {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 方法在每一层中传递额外的标签。