【问题标题】:ggplot2: how to separate geom_polygon and geom_line in legend keys?ggplot2:如何在图例键中分离 geom_polygon 和 geom_line?
【发布时间】:2018-11-22 09:16:16
【问题描述】:

我想:

  • 删除 geom_polygon 图例键和
  • 内的行
  • 删除 geom_line 图例键周围的边框。

想要的输出是

到目前为止,我的尝试失败了。提前感谢您的帮助!

library(ggplot2)

set.seed(1337)

dat <- structure(list(id = structure(c(2L, 2L, 2L, 2L), 
                                    .Label = c("1.1", "1.2", "1.3", "2.1", "2.2", "2.3"), 
                                    class = "factor"), 
                     value = c(3.1, 3.1, 3.1, 3.1),
                     x = c(2.2, 1.1, 1.2, 2.5), 
                     y = c(0.5, 1, 2.1, 1.7)), 
                class = "data.frame", 
                row.names = c(NA, -4L))

line <- data.frame(
  x = cumsum(runif(50, max = 0.1)),
  y = cumsum(runif(50, max = 0.1))
)

ggplot(dat, aes(x = x, y = y)) +
  geom_polygon(aes(color = "Border", group = id), fill = NA) +
  geom_line(data = line, aes(colour = "Line"), size = 1) +
  theme(legend.background = element_rect(fill = "transparent"), 
        legend.box.background = element_rect(fill = "transparent", colour = NA),
        legend.key = element_rect(fill = "transparent"))

【问题讨论】:

  • 想法:在 geoms 中定义您的美学并使用 scale_fill 作为颜色。
  • @Masoud:你能把它作为答案发布吗?谢谢
  • 这是我之前使用过的解决方法;让我看看我能为你做些什么。

标签: r ggplot2 legend


【解决方案1】:

这是一个很好的问题,我已经看到了一些技巧。这很棘手,因为两种几何都映射到颜色,并且每种美学只能得到一个图例。这里有一种方法:实际制作单独的传说,每个传说都有不同的审美,并将它们伪装成一个传说。

对于线条,我没有映射到颜色,而是将“线条”映射到线型并硬编码颜色。然后我将线型比例设置为 1,一条实线。在guides 中,我取出了线型的标题并设置了顺序,因此颜色首先出现,然后是线型。现在有两个传说,但最下面的一个没有标题。为了使它们看起来像一个连续的图例,请在图例之间设置一个负间距。当然,如果你有另一个传奇,这将不会很好,在这种情况下,你需要一些不同的技巧。

library(ggplot2)

ggplot(dat, aes(x = x, y = y)) +
  geom_polygon(aes(color = "Border", group = id), fill = NA) +
  geom_line(aes(linetype = "Line"), data = line, color = "blue") +
  scale_linetype_manual(values = 1) +
  guides(linetype = guide_legend(title = NULL, order = 2), color = guide_legend(order = 1)) +
  theme(legend.background = element_rect(fill = "transparent"), 
        legend.box.background = element_rect(fill = "transparent", colour = NA),
        legend.key = element_rect(fill = "transparent"), 
        legend.spacing = unit(-1, "lines") )

请注意,您可以为此使用多种不同的美学组合,而不仅仅是颜色 + 线型。您可以改为映射到多边形的填充上,然后将其 alpha 设置为 0,以便创建填充图例,但实际上并未显示为填充。

【讨论】:

    【解决方案2】:

    他们必须是同一个传说的一部分吗?如果没有,那么您可以使用多边形的“填充”美学和线条的“颜色”美学:

    ggplot(dat, aes(x = x, y = y)) +
        geom_polygon(aes(fill = "Border", group = id), colour="black") +
        geom_line(data = line, aes(colour = "Line"), size = 1) +
        scale_fill_manual(values=c(NA))
    

    【讨论】:

    • 非常感谢。如果可能的话,我希望它们出现在同一个传说中
    • @IloveCatRPython 好的,这正是我的意思。你想要的有点棘手。因为边界(多边形)是一对相互连接的线。如果是点,那么我们可以将点图例中出现的线的形状定义为 NA 但现在,我很难想出一个满足您需求的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 2015-08-02
    • 1970-01-01
    • 2021-10-25
    • 2014-10-11
    • 1970-01-01
    • 2021-03-28
    • 2017-08-28
    相关资源
    最近更新 更多