68

相同的标题,但完全改写了这个问题。

为什么 alpha 在第一个情节中起作用,而在第二个情节中不起作用?我很难理解为什么使用硬编码值将矩形绘制在正确的位置但没有变得透明,但是在 data.frame 中它按预期工作?

mtcars$cyl <- factor(mtcars$cyl)
mtcars$am <- factor(mtcars$am)

ggplot(mtcars) +
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(data=data.frame(xmin=100, xmax=200, ymin=0, ymax=Inf), aes(xmin=xmin, xmax=xmax, ymin=ymin,ymax=ymax), fill="red", alpha=0.2) 

ggplot(mtcars) +
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(aes(xmin=100, xmax=200, ymin=0,ymax=Inf), fill="red", alpha=0.2) 
4

4 回答 4

139

这让我很困惑,所以我去了谷歌,最后学到了一些新东西(在他们的例子中解决了一些变幻莫测的问题之后)。

显然,您正在做的是在彼此之上绘制许多矩形,从而有效地消除了您想要的半透明度。因此,克服这个问题的唯一方法是将矩形坐标硬编码在一个单独的df中,或者......

ggplot() + 
  geom_density(data=mtcars, aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) +
  geom_rect(aes(xmin=100, xmax=200, ymin=0,ymax=Inf), alpha=0.2, fill="red")

...只是不要将您的 data.frame 全局分配给情节。相反,仅在您想要的层中使用它(在本例中为geom_density),而让其他层保持自由!或者,更好的是,用于annotate从默认 df 下修改您的绘图:

ggplot(mtcars) + 
  geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
  annotate("rect", xmin=100, xmax=200, ymin=0, ymax=Inf, alpha=0.2, fill="red") 

后一种方法使您可以对整个绘图使用单个 data.frame,因此您不必为每个图层指定相同的 df。

两种方法都返回相同的图:

在此处输入图像描述

于 2013-07-11T03:51:50.307 回答
23

另一种解决方法是提供geom_rect()单行数据对象以确保仅绘制一个矩形:

ggplot(mtcars) +
  geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
  geom_rect(data=mtcars[1,], aes(xmin=100, xmax=200, ymin=0,ymax=Inf), fill="red", alpha=0.2)

在此处输入图像描述

于 2013-12-21T15:34:46.420 回答
2
ggplot(df, aes(xmin = x, xmax = x + 1, ymin = y, ymax = y + 2)) +
  geom_rect(alpha=.2) + 
  geom_rect(data=data.frame(xmin=3, xmax=6, ymin=3, ymax=5), 
            aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax), 
            fill="green", alpha=.2)
于 2013-07-08T08:35:26.180 回答
0

对于那些试图在构面时在 geom_rect 中指定填充和 alpha 值的人,我发现我必须在数据框中指定与每个构面一致的行,以使矩形出现在该构面中。对于一个三面点图和两个矩形以跨越 3 个面:

plotpnts = ggplot(SHDates, aes(x=Order, y=NewMean))
Fig2 = plotpnts + 

# Rectangles for time periods   
geom_rect(data=SHDates[1,], xmin=0,ymin=500,xmax=39,ymax=1100, fill="red",    alpha=0.4) +
geom_rect(data=SHDates[11,], xmin=0,ymin=500,xmax=39,ymax=1100, fill="red", alpha=0.4) +
geom_rect(data=SHDates[22,], xmin=0,ymin=500,xmax=39,ymax=1100, fill="red", alpha=0.4) +
geom_rect(data=SHDates[1,], xmin=0,ymin=1000,xmax=39,ymax=1400, fill="orange", alpha=0.4) + 
geom_rect(data=SHDates[11,], xmin=0,ymin=1000,xmax=39,ymax=1400, fill="orange", alpha=0.4) + 
geom_rect(data=SHDates[22,], xmin=0,ymin=1000,xmax=39,ymax=1400, fill="orange", alpha=0.4) + 
于 2019-02-11T20:25:03.760 回答