ggplot贴图的奇怪内存问题

时间:2013-04-15 10:57:59

标签: r memory ggplot2 gis shapefile

我正在尝试制作一些不列颠群岛的地图,并遇到了一个非常奇怪的记忆问题。我的工作流程利用ggplot的图层将新细节添加到基本地图上。

基本地图本身从GADM获取英国和爱尔兰的形状文件,使用MapTools中的thinnedSpatialPoly简化几何图形,从而生成此地图:

enter image description here

然后对于后续图层,我做同样的事情:加载SHP文件,简化几何图形并将其添加到基本地图中,如:

# new_data is a SpatialPolygonsDataFrame
base_map + geom(data=new_data, color="black", fill=my_fill)

enter image description here

对于大多数地图,我正在使这个工作得很好。但是当我尝试添加一个特定图层时,R会冻结并最终给我以下错误:

Error: cannot allocate vector of size 86.9 Mb
In addition: Warning messages:
1: In data.frame(x = x, y = y, aes_df) :
  Reached total allocation of 3953Mb: see help(memory.size)
2: In data.frame(x = x, y = y, aes_df) :
  Reached total allocation of 3953Mb: see help(memory.size)
3: In as.data.frame.numeric(x[[i]], optional = TRUE) :
  Reached total allocation of 3953Mb: see help(memory.size)
4: In as.data.frame.numeric(x[[i]], optional = TRUE) :
  Reached total allocation of 3953Mb: see help(memory.size)
5: In as.data.frame.numeric(x[[i]], optional = TRUE) :
  Reached total allocation of 3953Mb: see help(memory.size)
6: In as.data.frame.numeric(x[[i]], optional = TRUE) :
  Reached total allocation of 3953Mb: see help(memory.size)

生成此图的代码与上面完全相同。如果我自己绘制新图层,例如

ggplot(new_data, aes(x=long, y=lat, group=group)) + geom_polygon

然后没有问题,地图绘制得非常快。对于磁盘上的参考,形状文件为769 KB,而其他层为248 KB。

我在这里不知道如何调试和解决这个问题。任何指针都会很棒 - 谢谢!

1 个答案:

答案 0 :(得分:2)

我应该猜到了......问题在于基本地图和新图层上的不同投影。如果我记得在基础层上包含相同的coord_map投影,那么新图层会使用Traverse Mercator投影,这会导致内存问题。

您可以通过下载这些shapefile来重新创建问题(我使用UKBORDERS,但您也可以从CDU获取它们,再次使用不同的投影),然后执行以下操作:

ggplot(new_data, aes(x=long, y=lat, group=group)) + geom_polygon() +
         coord_map(proj="azequalarea")

要修复它,请将原始shapefile加载到QGis中,选择Settings > Project Properties...并选择WGS 84投影,应用并保存。新的shapefile工作得很好,给了我这个可爱的结果:

enter image description here