Reputation: 421
I have an input data frame with 4 columns.
test <- head(mtcars[,c(1,2,8,9)])
test
mpg cyl vs am
Mazda RX4 21.0 6 0 1
Mazda RX4 Wag 21.0 6 0 1
Datsun 710 22.8 4 1 1
Hornet 4 Drive 21.4 6 1 0
Hornet Sportabout 18.7 8 0 0
Valiant 18.1 6 1 0
With a for loop, I would like to plot mpg
vs cyl
, then mpg
vs vs
, then mpg
vs am
, producing 3 distincts plots on the same page.
my code (inspired from Multiple ggplots on one page using a for loop and grid.arrange and ggplot2 : printing multiple plots in one page with a loop):
library(ggplot2)
library(gridExtras)
plot_list <- list()
for(i in 2:ncol(test)){
plot_list[[i]] <- ggplot(test, aes(x=test[,i], y=mpg, fill=test[,i])) +
geom_point()
}
grid.arrange(grobs=plot_list)
Output:
Error in gList(list(wrapvp = list(x = 0.5, y = 0.5, width = 1, height = 1, :
only 'grobs' allowed in "gList"
Upvotes: 4
Views: 663
Reputation: 132706
The canonical way is faceting:
test <- head(mtcars[,c(1,2,8,9)])
library(reshape2)
test <- melt(test, id.vars = "mpg")
library(ggplot2)
ggplot(test, aes(x = value, y = mpg, fill = value)) +
geom_point() +
facet_wrap(~ variable, ncol = 1)
If you are set on your way:
library(gridExtra)
plot_list <- list()
test <- head(mtcars[,c(1,2,8,9)])
for(i in 2:ncol(test)){
plot_list[[i-1]] <- ggplotGrob(ggplot(test, aes(x=test[,i], y=mpg, fill=test[,i])) +
geom_point())
}
do.call(grid.arrange, plot_list)
Upvotes: 4