ggplot2 中多个图例中的下标

Jel*_*llz 6 r legend subscript ggplot2

为了使我的图形适合黑白打印,我将一个变量与“形状”、“lty”、“颜色”映射在一起。

ggplot(df, aes(x=time, y=mean, 
               shape=quality, 
               lty=quality,
               color=quality))
Run Code Online (Sandbox Code Playgroud)

我得到的数字是这样的 在此输入图像描述 我想将图例的一部分作为订阅者,代码如下:

labels=c(expression(Pol[(Art)]), expression(Pol['(Aca-)']), expression(Pol['(Aca-)']))
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我将“标签”放在颜色或形状中时,它使图例变得非常复杂,例如,

在此输入图像描述

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

Bri*_*ian 7

要更改分类尺度的标签,您可以使用scale_*_discrete(labels = ...)。在这里您只需对colorshape、 和执行此操作linetype

您应该避免使用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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

  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)
Run Code Online (Sandbox Code Playgroud)

更新:

这种方法大部分都很好,但现在expression(...)语法有一个更好的替代方案,即优秀的基于 markdown 的{ggtext}包: https: //github.com/wilkelab/ggtext

要更改为此方法,请使用(可选的,命名的)标签向量,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

然后将此行添加到您的主题中:

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)
Run Code Online (Sandbox Code Playgroud)

相对于其他方法的优点是:

  1. Markdown 语法更容易在线搜索帮助,
  2. 现在这些标签可以作为一列存储在实际数据中,而不是分别将它们传递给每个几何对象

您可以使用该新列作为美学映射 [ ggplot(..., aes(color = my_new_column, linetype = my_new_column, ...)],而不必使用该purrr::invoke方法在每个层中传递额外的标签。

  • 要从特定标签值映射到新标签,您可以使用:`lab1 &lt;- c("myTextualLabelFieldValue" = expression(my^{fancy}[label]), ... )` (2认同)