代码之家  ›  专栏  ›  技术社区  ›  Simon Kuang

geom_density未正确填充scale_y_log10

  •  2
  • Simon Kuang  · 技术社区  · 9 年前

    代码:

    require(ggplot2)
    set.seed(0)
    xvar <- rnorm(100)
    ggplot(data.frame(xvar), aes(xvar)) + geom_density(fill="lightblue") + scale_y_log10()
    

    图表大致如下: badgraph

    如何在密度估计值的右侧(即下方)绘制图形阴影?

    2 回复  |  直到 9 年前
        1
  •  4
  •   Curt F.    9 年前

    问题是 stat_density 默认情况下,填充密度和 y=0 第行 转化 数据因此,更改y=0行的转换将成为此类问题的牺牲品 ggplot2 尽管图形语法专家可能认为y变换密度没有意义,但这个bug可能不会引起太多关注。

    一个非常笨拙的解决方法是手动向 ..density.. ,您必须显式调用,然后更改中断,使其看起来没有做任何奇怪的事情。

    require(ggplot2)
    require(scales)
    set.seed(0)
    xvar <- rnorm(100000)
    quartz(height=4,width=6)
    ggplot(data.frame(xvar), aes(x=xvar, y=log10(..density..)+4)) + 
        geom_density(fill='lightblue') +
        scale_y_continuous(breaks=c(0,1,2,3,4), 
            labels=c('0.0001', '0.001', '0.01', '0.1','1'), limits=c(0,4),
            name='density')
    quartz.save('![StackOverflow_29111741_v2][1].png')
    

    该代码生成以下图形: Kludged graph

        2
  •  -1
  •   Curt F.    9 年前

    这不是 ggplot2 甚至是一个 R 这是一个简单的问题,因为对于样本大小,概率分布的尾部采样不足。对数轴可能永远向下,需要无限长的时间才能“达到”零,但任何有限的样本大小都不可能覆盖分布中越来越不可能的区域。

    因此,为了使绘图更漂亮,您需要(a)将点数从100增加到10000或更高,同时(b)保持绘图 ylim 这是一样的。(否则,您在 rnorm 呼叫将 稀疏地 填充高斯的尾部,甚至远离平均值,令人信服 聚合图2 使自动 y 轴的极限甚至更低,在采样较差的尾部范围内,您不喜欢的噪声将返回。)

    require(ggplot2)
    require(scales)
    set.seed(0)
    xvar <- rnorm(100000)
    ggplot(data.frame(xvar), aes(xvar)) + 
        geom_density(fill="lightblue") + 
        scale_y_continuous(trans=log10_trans(), limits = c(0.01, 1))
    

    这就产生了这个情节,我认为这就是你想要的。 enter image description here