使用ggplot的“annotation_raster”并达到了R的“内存上限”

时间:2012-04-06 16:47:48

标签: r memory-management annotations ggplot2 raster

我正在使用R创建一个房子的平面图,如下图所示,从底层开始:

  • basemap:平面图的扫描版本,我把它放在底层以帮助阅读
  • bed:房子有几十张床,分散在房子的不同房间,根据居民的特点有不同的颜色
  • piechart:每张床都有一个顶部的饼图,再次根据居民的其他特征创建了饼图,有些床有拼贴图,有些则没有。

基于底图创建的shp文件创建了bedpiechart(即我使用Mapwindow创建一个矢量图层,将底图导入为栅格图层并将其放在底部然后逐个绘制床。然后将床shp文件导入R,计算床多边形的质心,并且质心有助于定位饼图。

我使用read.jpegbasemap导入imagematrix对象,然后使用annotation_raster中新的ggplot2 0.9函数放置basemap在底部地图图层,由于bed图层也是基于basemap创建的,因此bed图层在basemap图层上完美地叠加在ggplot2图层上。

我可以毫无问题地创建地图 - 如果basemap足够小(3000 x 3000像素),现在我有basemap8000+ x 3000+像素({{1}当我创建shp文件时,我没有意识到R内存问题,如果禁用object.sizeggplot对象可以编译,但R一直说我当我尝试将annotation_raster包含到basemap对象中时,可以使用xxxMB分配内存。

我认为这与jpg文件的压缩无关,因为即使我进一步压缩jpg文件,维度也不会改变。但我无法调整jpg文件的大小,因为我的ggplot图层是根据原始jpg文件的维度创建的。

任何人都可以帮助缩小bed的图像矩阵的大小,而不改变jpeg的维度,或其他一些技巧来处理R的内存限制吗?感谢。

1 个答案:

答案 0 :(得分:0)

我修好了。

我首先创建了一个宽度和高度减半的新basemap图像文件,然后在annotation_raster我执行了以下操作:

chart <- chart + annotation_raster(db$temp.basemap,
                                   xmin=0,
                                   xmax=basemap.xlength*2,  # I stretched the image in R
                                   ymin=0,
                                   ymax=basemap.ylength*2)  # I stretched the image in R

现在可以在R的内存限制内编译地图,我能想到的缺点是图像质量降低,但这是可以承受的,因为它原来是8000 x 3000