gpt4 book ai didi

r - 如何有效地将多个 rgl 图连接成一个图?

转载 作者:行者123 更新时间:2023-12-02 11:56:20 25 4
gpt4 key购买 nike

我使用 rgl 包为数据的每个因子级别生成了 3D 图,并将它们保存为 png。我的数据有 30 个不同的级别,从而产生了 30 个不同的图像文件。现在我想将这些 png 合并到一个图中。

我会这样显示它们:

enter image description here

以下示例说明了我想要做的事情:

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

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

输入部分工作得相当好,但生成的数据框非常大(4.5e+07行),ggplot(可以理解)无法正确处理。

如何快速高效地创建绘图?最好使用 R,但也可以使用其他软件。

最佳答案

这是一个使用grid函数grid.raster和来自latticexyplot的解决方案。我认为 grid.raster 更快渲染到屏幕,因此它是性能的良好候选者。我选择lattice,因为它使用面板定制更容易集成网格功能。

enter image description here

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

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

然后我准备散点图数据:

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

最后我将 xyplot 与自定义面板函数一起使用:

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解决方案。

关于r - 如何有效地将多个 rgl 图连接成一个图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15221988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com