使用ggplot2在一个canvas中的多个graphics

我正在试图合并两个ggplot2情节到基于这个表的一个:

Type RatingA RatingB 1 One 3 36 2 Two 5 53 3 One 5 57 4 One 7 74 5 Three 4 38 6 Three 8 83 

我想要制作两个散点图,分别是y轴上的评级平均值和x轴上的types。

这是我如何创build每个graphics:

 p1 <- ggplot(test, aes(x=reorder(Type, RatingA, mean), y=RatingA)) + stat_summary(fun.y="mean", geom="point") p2 <- ggplot(test, aes(x=reorder(Type, RatingB, mean), y=RatingB)) + stat_summary(fun.y="mean", geom="point") 

由于p1和p2具有相同的x轴,所以我想让它们垂直排列。 我看着facet_align,但我找不到能做这项工作的东西。

你可以像这样在gridExtra包中使用grid.arrange()

 grid.arrange(p1, p2) 

胡里奥

你提到p1和p2具有相同的x轴,但是基于平均值的重新sorting并不会使它们相同。 p1的轴是“一 – >两 – >三”,而p2的轴是“二 – >一 – >三”。 这是故意的吗?

无论如何, ggplot提供了一些其他的解决scheme,将这些情节组合成一个,即colourfaceting (你可能已经尝试过?)。 这两者之一的第一步是将你的data.frame融合成长格式。 我们将识别idvariables“Type”,并且melt假定其余的列将被melted

 test.m <- melt(test, id.var = "Type") 

新对象结构的快速检查表明大部分内容都是一致的,除了types的级别有点不合时宜之外:

 > str(test.m) 'data.frame': 12 obs. of 3 variables: $ Type : Factor w/ 3 levels "One","Three",..: 1 3 1 1 2 2 1 3 1 1 ... $ variable: Factor w/ 2 levels "RatingA","RatingB": 1 1 1 1 1 1 2 2 2 2 ... $ value : int 3 5 5 7 4 8 36 53 57 74 ... 

所以让我们重新设定关卡:

 test.m$Type <- factor(test.m$Type, c("One", "Three", "Two"), c("One", "Two", "Three")) 

现在进行绘图。 颜色:

 ggplot(test.m, aes(x = Type, y = value, group = variable, colour = variable)) + stat_summary(fun.y = "mean", geom = "point") 

或与方面:

 ggplot(test.m, aes(x = Type, y = value, group = variable)) + stat_summary(fun.y = "mean", geom = "point") + facet_grid(variable ~ ., scales = "free") 

注意我在刻面中使用了scales = "free"参数,这样每个plot都有自己的刻度。 如果这不是你想要的效果,简单地删除这个论点。

这是一个老问题,但是我最近发现了多function的function,使他的工作非常好。

多function函数来自Cookbook for R:

它自己的function是:

 # Multiple plot function # # ggplot objects can be passed in ..., or to plotlist (as a list of ggplot objects) # - cols: Number of columns in layout # - layout: A matrix specifying the layout. If present, 'cols' is ignored. # # If the layout is something like matrix(c(1,2,3,3), nrow=2, byrow=TRUE), # then plot 1 will go in the upper left, 2 will go in the upper right, and # 3 will go all the way across the bottom. # multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) { require(grid) # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) # If layout is NULL, then use 'cols' to determine layout if (is.null(layout)) { # Make the panel # ncol: Number of columns of plots # nrow: Number of rows needed, calculated from # of cols layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), ncol = cols, nrow = ceiling(numPlots/cols)) } if (numPlots==1) { print(plots[[1]]) } else { # Set up the page grid.newpage() pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) # Make each plot, in the correct location for (i in 1:numPlots) { # Get the i,j matrix positions of the regions that contain this subplot matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE)) print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row, layout.pos.col = matchidx$col)) } } } 

你只需要将这个函数发送到你的脚本。