【问题标题】:ggplot2: set (nonlinear) values for alphaggplot2:为 alpha 设置(非线性)值
【发布时间】:2012-07-31 10:32:21
【问题描述】:

我想绘制一条镜像的 95% 密度曲线并将 alpha 映射到密度:

foo <- function(mw, sd, lower, upper) {
x <- seq(lower, upper, length=500)
dens <- dnorm(x, mean=mw, sd=sd, log=TRUE)
dens0 <- dens -min(dens)
return(data.frame(dens0, x))
}

df.rain <- foo(0,1,-1,1)

library(ggplot2)


drf <- ggplot(df.rain, aes(x=x, y=dens0))+
geom_line(aes(alpha=..y..))+
geom_line(aes(x=x, y=-dens0, alpha=-..y..))+
stat_identity(geom="segment", aes(xend=x, yend=0, alpha=..y..))+
stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0, alpha=-..y..))
drf

这很好用,但我想让边缘和中间的对比更加突出,即我希望边缘接近白色,只有中间部分是黑色的。我一直在篡改scale_alpha(),但没有运气。有什么想法吗?

编辑:最终,我想绘制几个雨滴,即单个雨滴会很小,但阴影仍应清晰可见。

【问题讨论】:

    标签: r ggplot2 alpha


    【解决方案1】:

    我不会将dens0 映射到alpha,而是将其映射到color

    drf <- ggplot(df.rain, aes(x=x, y=dens0))+
       geom_line(aes(color=..y..))+
       geom_line(aes(x=x, y=-dens0, color=-..y..))+
       stat_identity(geom="segment", aes(xend=x, yend=0, color=..y..))+
       stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0, color=-..y..))
    

    现在我们仍然有颜色的对比主要存在于尾巴上。使用两种颜色会有所帮助(注意颜色切换为 0.25):

    drf + scale_color_gradient2(midpoint = 0.25)
    

    最后,为了包含dens0 值的分布,我将色标的中点基于数据中的中值:

    drf + scale_color_gradient2(midpoint = median(df.rain$dens0))
    

    注意!:但是,无论您调整数据的方式如何,数据中的最大对比是数据集中更极端的值。试图通过弄乱非线性比例或像我一样调整色标来掩盖这一点,可能会呈现真实数据的虚假画面。

    【讨论】:

    • 感谢保罗。我以前尝试过所有这些,但对结果不满意,我发现它可以以黑白显示很重要。我觉得在我的示例中,alpha 的范围仅从灰色到黑色。我想过以某种方式在从白色到黑色的整个范围内增加 alpha 的范围。
    【解决方案2】:

    这是一个使用 geom_ribbon() 代替 geom_line() 的解决方案

    df.rain$group <- seq_along(df.rain$x)
    tmp <- tail(df.rain, -1)
    tmp$group <- tmp$group - 1
    tmp$dens0 <- head(df.rain$dens0, -1)
    dataset <- rbind(head(df.rain, -1), tmp)
    ggplot(dataset, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
      alpha = dens0)) + geom_ribbon() + scale_alpha(range = c(0, 1))
    

    ggplot(dataset, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
      fill = dens0)) + geom_ribbon() + 
      scale_fill_gradient(low = "white", high = "black")
    

    请参阅 Paul 更改颜色的答案。

    dataset9 <- merge(dataset, data.frame(study = 1:9))
    ggplot(dataset9, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
        alpha = dens0)) + geom_ribbon() + scale_alpha(range = c(0, 0.5)) + 
        facet_wrap(~study)
    

    【讨论】:

    • 嗯。一旦我生成了几个图,轮廓就会出现锯齿状,整体结果会出现黑色:n &lt;- 10 dataset5 &lt;- do.call("rbind", replicate(n, dataset, simplify = FALSE)) dataset5$study &lt;- rep(c(1:10), each=998) ggplot(dataset5, aes(x = x, ymin = -dens0, ymax = dens0, group = group, alpha = dens0)) + geom_ribbon() + scale_alpha(range = c(0, 1))+ facet_grid(study~.)
    • 你能提供一个锯齿状轮廓的例子吗?我没有用你的代码得到它们。如果图像是黑色的,则使用 scale_alpha 的范围参数播放一下。 0 = 完全透明,1 = 完全不透明。或者您可以在 geom_ribbon 中添加一个 'colour = "gray"' 或 'colour = "red"' 参数
    • 锯齿状轮廓是由于我将图形打印为像素格式。似乎可以通过同时使用geom_ribbongeom_line 来解决这个问题。
    【解决方案3】:

    在思考您的两个答案时,我实际上找到了我正在寻找的东西。最简单的方法是简单地使用带有灰色向量的scale_colour_gradientn

    library(RColorBrewer)
    grey <- brewer.pal(9,"Greys")
    
    drf <- ggplot(df.rain, aes(x=x, y=dens0, col=dens0))+
     stat_identity(geom="segment", aes(xend=x, yend=0))+
     stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0))+
     scale_colour_gradientn(colours=grey)
    drf
    

    【讨论】:

      猜你喜欢
      • 2018-11-04
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2015-01-02
      • 2012-06-26
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      相关资源
      最近更新 更多