1

我又一次遇到了一个复杂的ggplot。我想使用构面网格在一个绘图中绘制不同的绘图类型。

我希望我可以用下面的例子来说明我的观点:我想制作一个类似于第一张图片的情节,但上面的情节应该看起来像第二张图片。我已经找到了使用子集函数的技巧,但我不能只在一个图中添加垂直线,更不用说两个或三个(或指定颜色)。

代码:

a <- rnorm(100)
b <- rnorm(100,8,1)
c <- rep(c(0,1),50)


dfr <- data.frame(a=a,b=b,c=c,d=seq(1:100))
dfr_melt <- melt(dfr,id.vars="d")

#I want only two grids, not three
ggplot(dfr_melt,aes(x=d,y=value)) + facet_grid(variable~.,scales="free")+
geom_line(subset=.(variable=="a")) + geom_line(subset=.(variable=="b"))

#Upper plot should look like this
ggplot(dfr,aes(x=d,y=a)) + geom_line() + geom_line(aes(y=c,color="c"))+
geom_hline(aes(yintercept=1),linetype="dashed")+
geom_hline(aes(yintercept=-2),linetype="dashed")

示例 1

示例 2

4

2 回答 2

5

如果我正确理解了您的问题,您只需要一variabledfr以允许刻面工作:

dfr$variable = "a"
ggplot(subset(dfr_melt, variable=="a"),aes(x=d,y=value)) +  
  facet_grid(variable~.,scales="free")+
  geom_line(data=subset(dfr_melt,variable=="a"))  + 
  geom_line(data=subset(dfr_melt, variable=="b")) + 
  geom_line(data=dfr, aes(y=c, colour=factor(c))) + 
  geom_hline(aes(yintercept=1),linetype="dashed")+
  geom_hline(aes(yintercept=-2),linetype="dashed")

请注意,我的情节没有 zig-zig 线,这是因为我改变了:

  #This is almost certainly not what you want
  geom_line(data=dfr, aes(y=c, colour="c"))

  #I made c a factor since it only takes the values 0 or 1
  geom_line(data=dfr, aes(y=c, colour=factor(c)))
  ##Alternatively, you could have
  geom_line(data=dfr, aes(y=c), colour="red") #or
  geom_line(data=dfr, aes(y=c, colour=c)) #or

在此处输入图像描述

于 2012-11-28T17:36:57.977 回答
1

据我所知,您不能使用 facet.grid() 将多个绘图类型放在一个绘图中。据我所知,您的两个选择是

  • 将空数据放在第一个方面,因此这些行“存在”但不显示,或者

  • 使用视口将多个绘图合并为一个。

我认为第二种解决方案更通用,所以我就是这样做的:

#name each of your plots
p2 <- ggplot(subset(dfr_melt, variable=="a"),aes(x=d,y=value)) + facet_grid(variable~.,scales="free")+
  geom_line(subset=.(variable=="a")) + geom_line(subset=.(variable=="b"))

#Upper plot should look like this
p1 <- ggplot(dfr,aes(x=d,y=a)) + geom_line() + geom_line(aes(y=c,color="c"))+
  geom_hline(aes(yintercept=1),linetype="dashed")+
  geom_hline(aes(yintercept=-2),linetype="dashed")

#From Wickham ggplot2, p154
vplayout <- function(x,y) {
  viewport(layout.pos.row=x, layout.pos.col=y)
}

require(grid)
png("myplot.png", width = 600, height = 300) #or use a different device, e.g. quartz for onscreen display on a mac
grid.newpage()
pushViewport(viewport(layout=grid.layout(2, 1)))
print(p1, vp=vplayout(1, 1))
print(p2, vp=vplayout(2, 1))
dev.off()

在此处输入图像描述

您可能需要稍微摆弄一下才能让它们完全正确地排列。关闭上图的刻面,并将下图的图例移动到底部,应该可以解决问题。

于 2012-11-28T17:15:46.050 回答