【问题标题】:ggplot kernal density plot lines overlapping improperlyggplot内核密度图线重叠不正确
【发布时间】:2021-04-17 12:59:35
【问题描述】:

我的密度图中的颜色是错误的!我不知道为什么。

这是我的数据:https://pastebin.com/0jqHgvxx

data %>%
  ggplot(aes(x=amountremain, color=black)) +
  geom_density()  

当我检查原始数据时,我发现 x=0 处的红色峰值是正确的,但最大 x 值对应于红色而非蓝色线的 a y 值。

黑色 = TRUE 的最大 x 值为 162414.6,黑色 = FALSE 的最大 x 值为 253021.3,因此尾巴应该是红色而不是蓝色。

b <- unclass(density(data$amountremain[data$black==FALSE]))
max(b$y)
max(b$x)
[1] 0.0003079798
[1] 253021.3
a <- unclass(density(data$amountremain[data$black==TRUE]))
max(a$y)
max(a$x)
[1] 0.0002832889
[1] 162414.6

【问题讨论】:

    标签: r ggplot2 stat kernel-density density-plot


    【解决方案1】:

    如果您在 y 轴上查看不同的刻度,您可以看到 TRUE 的最后一个非零值大约是 160000,而 FALSE 的最后一个非零值大约是 250000应该是。

    所以表示是正确的,但很难看到尾巴。

    查看:

    data %>% 
      ggplot(aes(x=amountremain, color=black)) +
      geom_density() + 
      ylim(0, 10^-5)
    

    编辑


    @MrFlick 解释了为什么线路没有中断。 如果您的目标是中断TRUE 在最后一个值上的分布,一种可能的解决方案是创建两个不同的密度数据帧:

    to_dens <- function(df) {
      d <- density(df)
      df_d <- tibble(x = d$x, y = d$y)
      return(df_d)
    }
    
    df1 <- df %>% 
      filter(black == TRUE) %>% 
      summarise(to_dens(amountremain))
    
    df2 <- df %>% 
      filter(black == FALSE) %>% 
      summarise(to_dens(amountremain))
    
    ggplot() + 
      geom_line(data = df1, aes(x = x, y = y), col = "steelblue3") +
      geom_line(data = df2, aes(x = x, y = y), col = "firebrick2")
    

    【讨论】:

    • 我担心的是蓝线 (TRUE) 超出了它的最后一个值 ~160000。蓝线不应该到此结束吗?
    • @myfatson 一般来说,密度假设无限支持。他们不假设他们受到观察到的最小值和最大值的限制。因此当ggplot绘制曲线时,曲线总是延伸到整个可见区域。
    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 2020-06-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2014-10-09
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多