首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有效地将多个rgl图合并为一个图?

如何有效地将多个rgl图合并为一个图?
EN

Stack Overflow用户
提问于 2013-03-05 18:55:42
回答 1查看 1.7K关注 0票数 4

我用rgl包为我的数据的每个因子级别生成了3D图,并将它们保存为pngs。我的数据有30个不同的级别,这导致了30个不同的图像文件。现在,我想将这些pngs组合成一个单独的图。

我会这样显示它们:

下面的例子说明了我想要做的事情:

代码语言:javascript
运行
复制
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

这工作得很好,但速度很慢。真正的pngs有更高的分辨率,我想绘制30个pngs,而不仅仅是9个,这导致我的机器在相当长的一段时间内完全没有响应(i7,8GBRAM)。

导入部分运行得相当好,但是产生的数据帧非常大(4.5e+07行),这是可以理解的,无法正确处理。

如何以快速有效的方式创建一个情节?最好使用R,但也可以使用其他软件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-06 00:48:16

这里有一个使用grid functiongrid.rasterxyplotgrid grid解决方案。我认为grid.raster有更快的屏幕渲染速度,所以它是一个很好的性能候选者。我选择网格是因为它使用面板定制更容易集成网格功能。

首先,我阅读了所有的png,使用png包中的readPNG (类似于您的解决方案)

代码语言:javascript
运行
复制
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!
   })

然后我为散点图准备数据:

代码语言:javascript
运行
复制
x = 1:4   ## here 4 because I use  16 plots
y = 1:4
dat <- expand.grid(x,y)

最后,我使用了带有自定义面板函数的xyplot

代码语言:javascript
运行
复制
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:这就是我所说的catty解决方案。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15221988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档