ggplot2:根据填充值为某些点设置alpha=0

10

我目前正在开发一个项目,需要创建与Hadley的ggplot2 0.9.0页面中关于stat_density2d()函数示例非常相似的图表。

library(ggplot2)
dsmall <- diamonds[sample(nrow(diamonds), 1000), ]
d <- ggplot(dsmall, aes(carat, price)) + xlim(1,3)
d + stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE)
last_plot() + scale_fill_gradient(limits=c(1e-5,8e-4))

enter image description here

我现在遇到的问题是如何将所有不在填充范围内的瓷砖实际上关闭alpha通道 (alpha=0)。因此,图像中所有看到的灰色瓷砖的alpha值应该设置为0。这将使图像更加美观,特别是在叠加到地图上时。

如果有人有任何建议,将不胜感激。


3
灰色区域由 scale_fill_gradient 函数的 na.value 参数控制,但即使我指定了透明颜色(比如 na.value=rgb(1,1,1,0)),它也会呈现不透明的状态,所以可能还有其他原因。 - Fojtasek
好的,也许如果我们可以将scale_alpha_continuous的限制设置为依赖于填充值(密度),然后将alpha na.value = 0设置为... - Jared Eccles
到目前为止还没有运气,尽管将其设置为“gray90”使它看起来几乎可以,因为这是背景网格的颜色...我实际上怀疑这是一个ggplot“问题”(小错误/愿望清单?)...可能与https://github.com/hadley/ggplot2/issues/475有关? - Ben Bolker
2个回答

12

另一种可能性是,只需使用ifelse而不是cut

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., alpha = ifelse(..density.. < 1e-5, 0, 1)), 
    contour = FALSE) + 
scale_alpha_continuous(range = c(0, 1), guide = "none")

在此输入图片描述


这也非常有效。您能否解释一下为什么仅在aes(..)选项中设置alpha不足以满足需求,而控制填充区域的透明度只能通过使用scale_alpha_continuous来设置范围?例如,我使用了alpha = ifelse(..density.. < 1e-5, 0, 0.7)scale_alpha_continuous(range = c(0, 0.7))来使填充区域略微透明。 - cengel

11

这似乎有效:

d + stat_density2d(geom="tile", 
     aes(fill = ..density.., 
     alpha=cut(..density..,breaks=c(0,1e-5,Inf))), 
     contour = FALSE)+
 scale_alpha_manual(values=c(0,1),guide="none")

这里输入图片描述


这太棒了,帮了我很多忙。如果可以的话,我会给它三个赞。 - cengel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接