我有一个类似于下面的数据集,我有一些特定组的数据,然后只有其他组的单一观察。我希望我的单个观察结果显示为点,但其他具有多个观察结果的组显示为线(无点)。我的代码如下:
编辑:我试图找到一种方法来做到这一点,而不使用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)
仅绘制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.aes
在guide_legend()
论证中有用的东西。
在你的情况下,我将首先分别计算每个组中的观察数量,因为这是线与点的基础。
sumdat = dat %>%
group_by(group) %>%
summarise(n = n() )
结果与图例中的因子级别的顺序相同,这就是为什么这样做的原因。
现在我们需要删除线条并在组只有一个观察点时保留点数。 0
代表一个空白行,NA
代表现在的形状。根据每组的观察数量,我使用ifelse()
语句为linetype
和shape
为override.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) ) ) )