不起作用的ggplot透明度

5
我想绘制一个半透明的矩形,颜色与背景相同,位于密度曲线上方,这样就可以创建一个较浅的后者垂直区域(用于可视化感兴趣的范围,如高峰时间)。如您所见,alpha 失败了。不知道有没有人能让以下代码正常工作?
我知道 ggplot 的 alpha 通道问题有其他帖子(例如此处),但似乎都无法解决这个问题,也不清楚版本方面的情况。
提前感谢 :)

enter image description here

d <- data.frame(rnorm(100, mean = 0, sd = 100)); names(d) <- 'data'

ggplot(d) + geom_density(aes(x=data),col=NA, fill='grey30') + opts(panel.background=NULL) +
  geom_rect(aes(xmin=-30, xmax=30, ymin=0, ymax=0.005), fill='white',alpha=0.2)

ggplot(d) + geom_density(aes(x=data),col=NA, fill='grey30') + opts(panel.background=NULL) +
  geom_rect(aes(xmin=-30, xmax=30, ymin=0, ymax=0.005), fill='#FFFFFF40')

1
尝试使用更低的alpha值,例如1/256。 - Julius Vainora
@Julius,你能把那个作为答案提交吗?对我来说它完美地工作。 - Ben Bolker
是的,就是这样,谢谢@Julius。我可能错过了关于比例尺的某些东西,因为在ggplot和其他R中,20%的alpha通常是可见的。 - geotheory
@geotheory,我添加了更多细节。我认为您没有漏掉任何内容,这与geom_rect有些关联。 - Julius Vainora
1个回答

9

看起来您选择的透明度值 alpha 过低,建议尝试使用比如 1/256 的值,这是最低的透明度值:

ggplot(d) + geom_density(aes(x = data), col = NA, fill = 'grey30') + 
  theme(panel.background = NULL) +
  geom_rect(aes(xmin = -30, xmax = 30, ymin = 0, ymax = 0.005), 
            fill = 'white', alpha = 1/256)

enter image description here

对我来说,这也是一个意外的解决方案,因为取 alpha = I(1/d) 意味着 d 是必须重叠绘制以产生实体颜色的点数,因此我们预期使用 1/256 会得到不同的结果。正如你所说,这是与 geom_rect 相关的一个相当频繁的问题。


2
15个月过去了,我终于知道了其中的原因!ggplot会为数据对象中的每一行绘制一个矩形,无论geom_rect是否使用它(回想起来很明显)。因此,解决方案是为geom_rect提供一个单行数据对象,例如geom_rect(data=d[1,],..,问题就解决了。 - geotheory

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