【问题标题】:Color aes disconnects geom_line()颜色 aes 断开 geom_line()
【发布时间】:2020-04-01 21:41:59
【问题描述】:

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

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() 提供了一个独特的线条。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    这是因为prob 是一个离散变量,条件prob &gt; 0.5 将您的数据分成两部分,它们之间存在差距:前半部分有max(prob) = .476,后半部分有min(prob) = .507。因此,折线图上的(垂直)差距就是这个数字之间的差距。

    你可以看到它,如果你过滤修改后的 data 以获得接近 0.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))
    

    差距明显变小:

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

    解决此问题的一种简单方法是在aes() 中添加虚拟美学group = 1,它会覆盖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))
    

    【讨论】:

    • 你能解释一下 group = 1 在这里做什么吗?
    • @Norhther 在this question 下对这种虚拟美学有一个很好的解释。基本上,默认的group 美学设置为x 变量。
    • 之前看过帖子,但还是不明白geom_line中的默认行为
    • @Norhther,我可能是错的,但据我所知:(1)如果我们只提供 xy 变量,两者都是离散的,ggplot 接收任务以“通过”它们绘制一条线。但是,(2)如果我们还提供 color 变量,它将 x-y 对分成两个(颜色)组,那么我们得到两个行,因为默认选项是 group = x,并且 xy 现在被 color = y ~ n 分割。但是,(3)如果我们还添加group = 1审美,我们告诉ggplot,尽管颜色分组,我们仍然希望将整个数据集保持为一个一致的组。
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多