禁用堆叠ggplot2

时间:2013-05-28 19:17:45

标签: r ggplot2

我想在另一个人面前放置条形图(我使用alphas传达信息)

在ggplot2中,如果我ggplot() + geom_bar() + geom_bar(),我最终会得到一个堆积的条形图,而不是一个在另一个之前的图层。如何更改/禁用此功能?

TPlot = ggplot() + 
  geom_bar(aes(x = 1:3, y=c(1,1,1), width=0.1),stat="identity", alpha=0, colour = "red",position="identity") +
  xlab("x") +
  ylab("y")

for (i in 1:3){
  TPlot = TPlot + geom_bar(aes(x = 1:3, y = c(i,i,i), width=0.1),stat="identity", position="identity", alpha=0.2)
}

TPlot

我希望看到更黑暗的地区有更多的酒吧被吸引,但事实并非如此。

2 个答案:

答案 0 :(得分:3)

我无法理解为什么但是for循环似乎有些奇怪。下面的代码效果很好。但是当我尝试使用for循环时,只会添加最后一个geom_bar

TPlot = ggplot() + 
  geom_bar(aes(x = 1:3, y=c(1,1,1), width=0.1),stat="identity", alpha=0.2,
           position="identity") +
  xlab("x") +
  ylab("y")

TPlot = TPlot + geom_bar(aes(x = 1:3, y = c(2,2,2), width=0.1),
                         stat="identity", position="identity", alpha=0.2)
TPlot = TPlot + geom_bar(aes(x = 1:3, y = c(3,3,3), width=0.1),
                         stat="identity", position="identity", alpha=0.2)

TPlot

enter image description here

使用for循环。

TPlot = ggplot() + 
  geom_bar(aes(x = 1:3, y=c(1,1,1), width=0.1),stat="identity", alpha=0.2, 
           position="identity") +
  xlab("x") +
  ylab("y")

for (i in 2:3){
  TPlot = TPlot + geom_bar(aes(x = 1:3, y = c(i,i,i), width=0.1),
                           stat="identity", position="identity", alpha=0.2)
}

TPlot

enter image description here

此代码有效。它导致与第一个相符的图片。感谢joran。

TPlot = ggplot() + 
  geom_bar(aes(x = 1:3, y=c(1,1,1), width=0.1),stat="identity", alpha=0.2, 
           position="identity") +
  xlab("x") +
  ylab("y")

for (i in c(2,3)){
  TPlot = TPlot + geom_bar(data=data.frame(x = 1:3, y = c(i,i,i)),
                           aes(x=x, y=y, width=0.1), 
                           stat="identity", alpha=0.2)
}

TPlot

答案 1 :(得分:3)

aes()创建一个未评估的表达式列表”,根据其帮助页面,所以在你的for循环中,你最终会得到相同的图层,因为它们引用了一个未评估的变量名“i” 。当ggplot最终构建层时,它使用i的任何值(更具体地说,如果你给它,它可以查看可选的environment)。但这在这里不起作用,因为你想为每一层提供不同的i值。您可以在循环中使用substitute()或bquote(),但最好为每个层构造一个新的data.frame。或者更好的是,使用循环创建单个data.frame,并使用变量来跟踪它引用的步骤。然后,您可以使用美学映射和/或构面,这更符合ggplot2的设计(并且比具有许多独立层更有效)。