颜色aes断开geom_line()

时间:2020-04-01 21:41:59

标签: r ggplot2

我试图绘制一个图,并在p> 0.5时显示不同的颜色,但是当我使用颜色aes时,线条似乎断开了。

enter image description here

library(tidyverse)

data <- tibble(n = 1:365)

prob <- function (x) {
  pr <- 1
  for (t in 2:x) {
    pr <- pr * ((365 - t + 1) / 365) 
  }
  return(1 - pr)
}


data %>%
  mutate(prob = map_dbl(n, prob)) %>%
  filter(n < 100) %>%
  ggplot(aes(x = n, y = prob, color = prob > 0.5)) + geom_line() + 
  scale_x_continuous(breaks = seq(0,100,10))

有人知道为什么吗?删除颜色aes()会提供唯一的一行。

1 个答案:

答案 0 :(得分:2)

这是因为prob是一个离散变量,而条件prob > 0.5会将您的数据分为两部分,两者之间有空隙:上半部分的max(prob) = .476,第二部分一半的min(prob) = .507。因此,折线图上的(垂直)间隙就是这些数字之间的间隙。

如果您过滤修改后的 data 值接近.5的内容,则可以看到它:

data %>%
  mutate(prob = map_dbl(n, prob)) %>%
  filter(n < 100) %>%
  filter(between(prob, .4, .6))

如果我们修改您的示例:

data2 <- data %>%
  mutate(prob = map_dbl(n, prob)) %>%
  filter(n < 100)

#bringing extremes closer together
data2$prob[22] <- .49999999999999
data2$prob[23] <- .50000000000001

data2 %>%
  ggplot(aes(x = n, y = prob, color = prob >= 0.5)) + geom_line() + 
  scale_x_continuous(breaks = seq(0,100,10))

差距大大缩小:

Line plot with the gap

但是,它仍然存在(主要在水平位置)-因为x变量也是离散的

解决此问题的一种简单方法是在group = 1内添加虚拟美学aes(),它会覆盖x变量的默认分组。

data %>%
  mutate(prob = map_dbl(n, prob)) %>%
  filter(n < 100) %>%
#add 'group = 1' below
  ggplot(aes(x = n, y = prob, color = prob >= 0.5, group = 1)) + geom_line() + 
  scale_x_continuous(breaks = seq(0,100,10))

Line plot without the gap

相关问题