geom_rect和alpha - 这是否适用于硬编码值?

时间:2013-07-08 07:48:04

标签: r ggplot2

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

为什么alpha工作在第一个图而不是第二个?我很难理解为什么使用硬编码的值在正确的位置绘制rect而不是透明但是在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 个答案:

答案 0 :(得分:91)

感谢您澄清您的问题。这让我感到困惑,所以我去谷歌,结束了learning something new(在他们的例子中解决了一些变幻莫测的问题后)。显然你正在做的是在彼此之上绘制许多矩形,有效地消除了你想要的半透明度。因此,解决这个问题的唯一方法是将矩形坐标硬编码为单独的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),并保持其他图层无df!或者,更好的是,使用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。

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

enter image description here

答案 1 :(得分:15)

另一种解决方法是为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)

enter image description here

答案 2 :(得分: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)

答案 3 :(得分:0)

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

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) +