有条件地应用Geom层 - 分开点和线

问题描述 投票:1回答:1

我有一个类似于下面的数据集,我有一些特定组的数据,然后只有其他组的单一观察。我希望我的单个观察结果显示为点,但其他具有多个观察结果的组显示为线(无点)。我的代码如下:

编辑:我试图找到一种方法来做到这一点,而不使用geom_*调用中的多个数据集,因为它与图例引起的问题。 有一个答案已被删除,能够处理传说,但没有摆脱线上的点 。我可能会喜欢一个单一的传奇,如果它们只是一个观察点,它们就会出现。

library(tidyverse)

dat <- tibble(x = runif(10, 0, 5),
              y = runif(10, 0, 20),
              group = c(rep("Group1", 4),
                        rep("Group2", 4),
                        "Single Point 1",
                        "Single Point 2")
              )

dat %>% 
  ggplot(aes(x = x, y = y, color = group)) + 
  geom_point() +
  geom_line()

reprex package创建于2019-04-02(v0.2.1)

r ggplot2
1个回答
4
投票

仅绘制geom_point()中1点的数据和geom_line()中> 1点的数据。这些可以在mutate()中预先计算。

dat = dat %>%
     group_by(group) %>%
     mutate(n = n() )

dat %>% 
     ggplot(aes(x = x, y = y, color = group)) + 
     geom_point(data = filter(dat, n == 1) ) +
     geom_line(data = filter(dat, n > 1) ) 

传说匹配这比较棘手。这就是override.aesguide_legend()论证中有用的东西。

在你的情况下,我将首先分别计算每个组中的观察数量,因为这是线与点的基础。

sumdat = dat %>%
     group_by(group) %>%
     summarise(n = n() )

结果与图例中的因子级别的顺序相同,这就是为什么这样做的原因。

现在我们需要删除线条并在组只有一个观察点时保留点数。 0代表一个空白行,NA代表现在的形状。根据每组的观察数量,我使用ifelse()语句为linetypeshapeoverride.aes

dat %>% 
     ggplot(aes(x = x, y = y, color = group)) + 
     geom_point(data = filter(dat, n == 1) ) +
     geom_line(data = filter(dat, n > 1) ) +
     guides(color = guide_legend(override.aes = list(linetype = ifelse(sumdat$n == 1, 0, 1),
                                                     shape = ifelse(sumdat$n == 1, 19, NA) ) ) )

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.