如何在基本图形中复制ggplot2 :: geom_raster?

时间:2017-03-22 00:51:17

标签: r ggplot2 graphics gis r-raster

TL;博士

如果您同时运行下面的两个代码段(注意:代码先前已损坏,但现在已修复且已在多台计算机上检查),您将看到两个栅格数据图​​。一个人使用ggplot2并生成一个平滑的图像,其中包含高分辨率的海岸线,这些海岸线以某种方式从我用来遮盖栅格的多边形中继承而来。

不使用ggplot2,我们可以使用raster::plot(... , interpolate='bilinear')rasterImage(interpolate = TRUE)获取平滑后的图像。但是地图中的海岸线看起来并不好(根据光栅的分辨率,它们是锯齿状/像素化的)。您可能需要放大一点才能看到这一点。我有两个问题:

  1. 如何在基本图形中绘制光栅,但只能在多边形的边缘处重叠,其边缘的分辨率高于光栅(产生类似于ggplot的输出)?我问这个问题in more detail here, with an example of the output I want.
  2. ggplot2如何理解多边形边缘的正确绘图位置?我看不出在哪里/怎么告诉ggplot什么是遮蔽多边形!
  3. 血腥细节

    我在R中绘制一个栅格。我最初使用ggplot2使用geom_raster()进行绘图,但现在我需要切换回基准R,因为我最终需要显示多个不同的栅格单个图上的颜色比例(这是一个地图,颜色比例最终会因大陆而异)。

    下面的代码将重现这些图(包括下载必要的文件)。在我的计算机上,完整的代码(下面的两个片段)大约需要1.5分钟才能运行 - 大部分是绘制/渲染图。

    library("rgdal")
    library("sp")
    library("raster")
    library("ggplot2")
    
    # Downloading and loading raster
    download.file("https://dl.dropboxusercontent.com/u/49481174/Stack.zip", destfile="Stack.zip")
    unzip("Stack.zip")
    msrP2 <- raster("Stack/msrP2.grd")
    
    plot(msrP2, interpolate='bilinear')
    

    请注意沿海岸线的像素化(您可能需要放大才能看到这一点)。这是基于栅格的分辨率。

    但要注意ggplot2中发生的事情!

    警告,渲染情节需要我机器上的大量内存

    # Convert to data.frame for ggplot2
    msr.p <- rasterToPoints(msrP2)
    mdf <- data.frame(msr.p)
    colnames(mdf) <- c("Longitude", "Latitude", "RichnessProp")
    
    # plot using geom_raster
    b_map <- ggplot(data=mdf, aes_string(y="Latitude", x="Longitude")) +
      geom_raster(aes(fill=RichnessProp)) +
      theme_bw() +
      coord_equal() +
      scale_fill_gradientn("DD", colours=c("gold1", "coral", "navy"), na.value="black") +
      theme(axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "right",
        legend.key = element_blank(),
        axis.ticks=element_blank()) +
      scale_y_continuous(limits=c(-5133051,6324167)) + 
      scale_x_continuous(limits=c(-20100000,20100000))
    
    b_map
    

    现在海岸线以高保真度再现!最终,其原因必须与这样一个事实有关,即这个光栅最初是通过使用大陆和湖泊的高分辨率shapefile屏蔽更大的光栅而产生的。因此,按重要性重新陈述问题:

    Q1。如何在基础R中创建此高分辨率图?

    Q2。 ggplot如何“知道”海岸线的位置基于我传递给它的data.frame?

1 个答案:

答案 0 :(得分:1)

由于你说ggplot占用大量内存而plot没有,我认为像素化来自raster::plot默认实际接受的事实只有一部分像素可以减少内存占用,具体取决于参数maxpixels

  

maxpixels   整数&gt; 0.用于绘图的最大单元格数。如果maxpixels&lt; ncell(x),在绘图之前使用sampleRegular。如果   gridded = TRUE maxpixels可以被忽略以获得更大的样本

我会尝试类似的事情:

plot(msrP2, interpolate='bilinear', maxpixels=50000000)

看看它是否解决了您的问题。

PS:关注Q2:ggplot2对“海岸线”一无所知。如果我是对的,你看到的问题只与raster::plot自动“降低”分辨率以节省你的记忆有关。