问题
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