How to effectively combine several rgl-graphs into one plot?

I produced 3D graphics with the rgl package for each level coefficient of my data and saved them as png. My data has 30 different levels, resulting in 30 different image files. Now I would like to combine these png into one plot.

I would display them as follows:

enter image description here

The following example illustrates what I would like to do:

 library(rgl) library(png) library(gridExtra) library(ggplot2) ## creates a png in the working directory which can be used as an example example(surface3d) rgl.snapshot("example.png") rgl.close() ## imports the png files; in the example, the same file is imported multiple times. if(exists("png.df")) rm(png.df) for (i in 1:9) { png.i <- readPNG("example.png") g <- rasterGrob(png.i, interpolate=TRUE) g <- g$raster g <- as.vector(g) g <- matrix(g, nrow = 256, ncol = 256, dimnames = list(1:256, 1:256)) df.i <- data.frame(i = rep(row.names(g), dim(g)[2]), j = rep(colnames(g), each = dim(g)[1]), col=as.vector(g)) df.i$i <- as.numeric(as.character(df.i$i)) df.i$j <- as.numeric(as.character(df.i$j)) df.i$col <- as.character(df.i$col) df.i$title <- paste ( "Plot", i) if(exists("png.df")) { png.df <- rbind(png.df, df.i) } else { png.df <- df.i } } rm(df.i, g) ## plots the data pl <- ggplot(png.df, aes( x = i, y = j)) pl <- pl + geom_raster(aes(fill = col)) + scale_fill_identity() pl <- pl + scale_y_reverse() pl <- pl + facet_wrap( ~ title) pl <- pl + coord_equal() + theme_bw() + theme(panel.grid = element_blank(), axis.text = element_blank(), axis.title = element_blank(), axis.ticks= element_blank()) pl 

This works pretty well, but it's pretty slow. Real pngs have a much higher resolution, and I would like to build 30 png, not just 9, which leads to the fact that my machine does not completely respond for a long time (i7, 8GB RAM).

Part of the import works quite well, but the resulting data frame is extremely large (4.5e + 07 lines), which ggplot (understandably) cannot handle properly.

How can you quickly and effectively create a plot? Preferably with R, but other software may also be used.

+4
source share
1 answer

Here we use a solution using the grid grid.raster and xyplot from the grid . I think grid.raster is faster than rendering to the screen, so it is a good candidate for performance. I choose the grid because it integrates the grid function more easily by setting the panel.

enter image description here

First I read all the png using readPNG from the png package (similar to your solution)

 ll <- list.files(path='c:/temp',patt='compo[0-9].*',full.names=T) library(png) imgs <- lapply(ll,function(x){ as.raster(readPNG(x)) ## no need to convert to a matrix here! }) 

Then I prepare the data for the scatter plot:

 x = 1:4 ## here 4 because I use 16 plots y = 1:4 dat <- expand.grid(x,y) 

Finally, I use xyplot with a custom panel function:

 library(lattice) library(grid) xyplot(Var2~Var1|rownames(dat),data=dat,layout=c(4,4), panel=function(x,y,...){ lims <- current.panel.limits() grid.raster(image =imgs[[panel.number()]],sum(lims$xlim)/2,sum(lims$ylim)/2, width =diff(lims$xlim), height=diff(lims$ylim),def='native' ) }) 

PS: this is what I call a catty solution.

+7
source

All Articles