R: arranging multiple plots together using gridExtra

好久不见. 提交于 2021-02-02 09:57:29

问题


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


回答1:


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))



回答2:


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)




回答3:


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)


来源:https://stackoverflow.com/questions/65832784/r-arranging-multiple-plots-together-using-gridextra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!