R语言 在ggplot2中显示点与线的图例

vnjpjtjt  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(398)

我试图在ggplot中生成一个图例,它显示的点与线的名称不同。我需要该图例与显示颜色、形状和线型的图例分开显示。
我最初的代码类似于这个小例子,它能工作。基本上,我人为地为点和线设置了一个大小美学,然后覆盖图例,只显示一个或另一个。据我所知,这是人们在他们的绘图中添加回归线的方法。然而,在ggplot2版本3.4.0中,使用大小美学的线被弃用。它仍然有效。但我觉得他们的行为有点改变。

# Use iris dataframe as example and create new column for horizontal lines
data <- iris %>%
  group_by(Species) %>%
  mutate(AvgLength = mean(Petal.Length))

ggplot(data) +
  geom_point(aes(x = Petal.Width, y = Petal.Length, color = Species, shape = Species, size = "Samples")) +
  geom_hline(aes(yintercept = AvgLength, color = Species, linetype = Species, size = "Average")) +
  # Set manual size to get normal points and linewidths
  scale_size_manual(values = c("Average" = .5, "Samples" = 1.5)) +
  # Override the size legend to show only a line for the first entry and only a point for the second
  guides(size = guide_legend(override.aes = list(linetype = c(1,0), shape = c(NA, 16)), title = ""))

Plot with desired legends
在我的实际应用程序中,线名称按字母顺序排在点名称之后(但在图例中应该显示在第一位),这打破了图例,如图所示。我认为在我第一次编写代码时(3.4.0之前),图例中遵守了size_scale的顺序,但我不确定。

ggplot(data) +
  geom_point(aes(x = Petal.Width, y = Petal.Length, color = Species, shape = Species, size = "Aa")) +
  geom_hline(aes(yintercept = AvgLength, color = Species, linetype = Species, size = "Average")) +
  scale_size_manual(values = c("Average" = .5, "Aa" = 1.5)) +
  guides(size = guide_legend(override.aes = list(linetype = c(1,0), shape = c(NA, 16)), title = ""))

Plot with legend messed up by name order
我想用新版本的ggplot做正确的事情,而不是使用大小美学,但我不知道如何在同一个图例上的点和线有不同的美学,因为我已经使用颜色的东西。我可以得到的最接近的是显示他们作为两个单独的图例,如下图所示,然后以某种方式手动更改间距。然而,如果您必须将此解决方案应用于图例显示在不同位置的多种类型的绘图,并且我不确定如何手动固定大小和线宽图例之间的间距,同时不处理其他图例,则此解决方案并不理想。

ggplot(data) +
  geom_point(aes(x = Petal.Width, y = Petal.Length, color = Species, shape = Species, size = "Aa")) +
  geom_hline(aes(yintercept = AvgLength, color = Species, linetype = Species, linewidth = "Average")) +
  scale_size_manual(values = c("Average" = .5, "Aa" = 1.5)) +
  scale_linewidth_manual(values = c("Average" = .5)) +
  guides(size = guide_legend(title = "", order = 1),
        linewidth = guide_legend(title = "", order = 2))

Plot that doesn't use the size aesthetic for lines, but the legends look weird
我知道ggplot通常不能很好地处理手动图例规范,因为你应该如何设置你的图和数据框。然而,我认为在这个应用程序中,很难设置不同的数据框。有人有一个干净的解决这个问题的方法吗?

wwtsj6pe

wwtsj6pe1#

由于我们现在必须处理两种美学,我们必须确保通过“复制”比例的规范来合并图例,即为两个比例中的两个类别设置一个值,并将limits设置为在每个图例中实际包括两个类别。这样做,sizelindwidth图例将合并。通过这些限制,您还可以设置图例中类别的顺序,并且最后我们可以使用override.aes来润色图例,即,去除用于“线”类别的shape和用于“点”类别的linetype

library(ggplot2)

ggplot(data) +
  geom_point(aes(x = Petal.Width, y = Petal.Length, color = Species, shape = Species, size = "Aa")) +
  geom_hline(aes(yintercept = AvgLength, color = Species, linetype = Species, linewidth = "Average")) +
  scale_size_manual(values = c("Average" = .5, "Aa" = 1.5), limits = c("Average", "Aa")) +
  scale_linewidth_manual(values = c("Average" = .5, "Aa" = 1.5), limits = c("Average", "Aa")) +
  labs(size = NULL, linewidth = NULL) +
  guides(
    size = guide_legend(
      override.aes = list(linetype = c("solid", "blank"), shape = c(NA, 16))
    )
  )

相关问题