【问题标题】:Subscript in multiple legends in ggplot2ggplot2中多个图例中的下标
【发布时间】:2021-11-05 03:55:13
【问题描述】:

为了使我的图形适合黑白打印,我将一个变量与“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-)']))

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

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

【问题讨论】:

  • 我认为您应该提供标签作为scale_colour_discrete 的参数,而不是作为额外的审美?但是一个可重复的例子会有所帮助 - 我们看不到你在做什么
  • @CalumYou,非常感谢,scale_*_discrete 工作!

标签: r ggplot2 legend subscript


【解决方案1】:

要更改分类量表的标签,请使用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)

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

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

【讨论】:

  • 非常感谢!这对我来说非常有效!非常感谢您的帮助:)
  • 要将特定标签值映射到您可以使用的新标签:lab1 &lt;- c("myTextualLabelFieldValue" = expression(my^{fancy}[label]), ... )
猜你喜欢
  • 2018-04-14
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多