R语言 如何在基础图形中复制 ggplot2::geom_raster?



tl;博士

如果运行下面的两个代码片段(注意:代码以前已损坏,但现在已修复,并且已在多台计算机上进行检查),您将看到一些栅格数据的两个图。其中一个使用ggplot2并生成具有高分辨率海岸线的平滑图像,这些海岸线以某种方式继承自我用于遮罩栅格的面。

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

  1. 如何在基本图形中绘制栅格,但仅限于其与边分辨率高于栅格的多边形重叠(产生类似于 ggplot 输出的内容)? 我在这里更详细地问这个问题,并举一个我想要的输出示例。
  2. ggplot2 如何了解多边形边缘的位置以进行正确绘制?我看不到我在哪里/如何告诉 ggplot 遮罩多边形是什么!

血腥细节

我正在 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

现在海岸线以高保真度再现! 最终,其原因必须与以下事实有关:此栅格最初是通过使用大陆和湖泊的高分辨率形状文件遮罩较大的栅格而生成的。因此,按重要性顺序重新陈述问题:

问题 1.如何在基数 R 中创建此高分辨率图?

问题 2.ggplot到底是如何根据我传递给它的data.frame"知道"海岸线在哪里的?

既然你说ggplot占用大量内存而plot不需要,我认为像素化来自这样一个事实,即默认情况下raster::plot实际上只接收像素的子集以减少内存占用,具体取决于参数maxpixels

最大像素 整数> 0。用于绘图的最大像元数。如果最大像素

我会尝试这样的事情:

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

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

PS:关注Q2:ggplot2对"海岸线"一无所知。如果我是对的,您看到的问题仅与以下事实有关:raster::plot会自动"降低"分辨率以节省内存。

相关内容

  • 没有找到相关文章

最新更新