R, ggplot2 - 在图例中,如何在一个 geom 中隐藏未使用的颜色,同时在其他 geom 中显示它们?

Jam*_*son 3 r ggplot2

我正在制作一个为 a 定义颜色的图,geom_point()一切看起来都很好。

points_a <- data.frame(x = sample(1:10, 4), y = sample(50:60, 4), id = "a")
points_b <- data.frame(x = sample(1:100, 4), y = sample(1:100, 4), id = "b")
points_c <- data.frame(x = sample(1:100, 4), y = sample(1:100, 4), id = "c")
points_all <- rbind(points_a, points_b, points_c)

ggplot(points_all) + geom_point(aes(x, y, color=id))
Run Code Online (Sandbox Code Playgroud)

带点的ggplot

我想通过使用 围绕它们绘制一个矩形来突出显示一组点,并geom_rect()选择图表中已使用的相同颜色。根据需要,图例在键中的项目周围添加边框;不幸的是,它还为图例中的每个其他项目添加了边框,如下所示:

my_box <- data.frame(left = 1, right = 10, bottom = 50, top = 60, id = "a")
ggplot(points_all) + 
  geom_point(aes(x, y, color=id)) + 
  geom_rect(data = my_box, 
    aes(xmin=left, xmax=right, ymin=bottom, ymax=top, color = id), 
    fill = NA, alpha = 1)
Run Code Online (Sandbox Code Playgroud)

带有点和矩形的 ggplot

我想去掉图例中项目“b”和“c”周围的轮廓,因为它们没有被绘制。我不知道该怎么做,因为它们是由与点相同的颜色美学定义的。理想情况下,这些未使用的因素应该从轮廓颜色的图例中删除,因为它们在只显示一个 时理应如此geom_,但这似乎不是它的工作原理。(并且在aes()调用之外手动定义颜色意味着它不会显示在 的图例中id="a"。)

虽然我可能忽略了一些东西,但很多搜索还没有得到答案。将图例中未使用的颜色隐藏起来geom_同时保留其他颜色的最佳方法是什么?(或者:我应该将这些分成两个传说,以及如何?)

aos*_*ith 6

我通常用override.aesin处理这类事情guide_legend()。在您的情况下,您可以将最后两个图例项的线型设置为0(无线)。第一个图例项应具有 linetype 1

ggplot(points_all) + 
     geom_point(aes(x, y, color=id)) + 
     geom_rect(data = my_box, 
               aes(xmin=left, xmax=right, ymin=bottom, ymax=top,
                   color = id), 
               fill = NA, alpha = 1) +
     guides(color = guide_legend(override.aes = list(linetype = c(1, 0, 0) ) ) )
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明