stats_noob
stats_noob

Reputation: 5897

R: arranging multiple plots together using gridExtra

I am using the R programming language. I am trying to arrange "plot1, plot2, plot3, plot4" on the same page:

library(kohonen) #fitting SOMs

library(ggplot2) #plots

library(GGally) #plots

library(RColorBrewer) #colors, using predefined palettes

 

iris_complete <-iris[complete.cases(iris),] #only complete cases... the iris dataset floats around in the sky with diamonds.

iris_unique <- unique(iris_complete) # Remove duplicates

 

#scale data

iris.sc = scale(iris_unique[, 1:4])

 

#build grid

iris.grid = somgrid(xdim = 10, ydim=10, topo="hexagonal", toroidal = TRUE)

 

# build model

set.seed(33) #for reproducability

iris.som <- som(iris.sc, grid=iris.grid, rlen=700, alpha=c(0.05,0.01), keep.data = TRUE)

 

 

###plots

 

var <- 1 #define the variable to plot

plot1 = plot(iris.som, type = "property", property = getCodes(iris.som)[,var], main=colnames(getCodes(iris.som))[var], palette.name=terrain.colors)

 

var <- 2 #define the variable to plot

plot2 = plot(iris.som, type = "property", property = getCodes(iris.som)[,var], main=colnames(getCodes(iris.som))[var], palette.name=terrain.colors)

 

var <- 3 #define the variable to plot

plot3 - plot(iris.som, type = "property", property = getCodes(iris.som)[,var], main=colnames(getCodes(iris.som))[var], palette.name=terrain.colors)

 

var <- 4 #define the variable to plot

plot4 = plot(iris.som, type = "property", property = getCodes(iris.som)[,var], main=colnames(getCodes(iris.som))[var], palette.name=terrain.colors)

 

 

 

 

g1 <- grid.arrange(plot1, nrow = 1)

g2 <- grid.arrange(plot2, nrow = 1)

g3 <- grid.arrange(plot3, nrow = 1)

g4 <- grid.arrange(plot4, nrow = 1)

 

grid.arrange(g1, g2, g3, g4, ncol = 1)

However, when I use the "grid.arrange()" function, I get an error : Error in gList - only 'grobs' allowed in gList"

Right now, I am considering running each of the "plot" statements individually, and manually joining them all using MS Paint. Is there a better way to do this?

Thanks

Upvotes: 0

Views: 2519

Answers (3)

Leonardo
Leonardo

Reputation: 2485

If you want to keep the approach you are using just add

par(mfrow=c(2,2))

before all four plots.

If you want everything on the same line add instead

par(mfrow=c(1,4))

Upvotes: 2

pascal
pascal

Reputation: 1085

Maybe try the package ggpubr instead of grid.arrange. I assume you will need to save your plots with recordPlot()

install.packages("ggpubr")
install.packages("gridGraphics")
library(ggpubr)
library(gridGraphics)

plot1 = recordPlot(iris.som, type = "property", property = getCodes(iris.som)[,var], main=colnames(getCodes(iris.som))[var], palette.name=terrain.colors)

[...]

ggarrange(plot1,plot2,plot3,plot4,ncol = 1)

Upvotes: 1

user12728748
user12728748

Reputation: 8506

It looks like you are dealing with the base plot system in R, and assigning the plots to variables does not generate anything (e.g. plot1 is NULL). You can use layout to split the graphics area into subsections and then plot the individual plots into those:

library(kohonen)
library(RColorBrewer)

iris_unique <- unique(iris[complete.cases(iris),]) # Remove duplicates

#scale data
iris.sc <- scale(iris_unique[, 1:4])

#build grid
iris.grid <- somgrid(xdim = 10, ydim=10, topo="hexagonal", toroidal=TRUE)

# build model
set.seed(33)
iris.som <- som(iris.sc, grid=iris.grid, rlen=700, alpha=c(0.05,0.01), keep.data=TRUE)

### plots
# prepare plot layout
graphics::layout(matrix(seq_len(4), 2, 2, byrow=TRUE), respect=FALSE)

# generate plots
for (var in seq_len(4)){
    plot(iris.som, type = "property", property = getCodes(iris.som)[,var], 
         main=colnames(getCodes(iris.som))[var], palette.name=terrain.colors)
}

Created on 2021-01-21 by the reprex package (v0.3.0)

Upvotes: 2

Related Questions