【发布时间】:2017-03-22 00:51:17
【问题描述】:
tl;博士
如果您同时运行下面的代码 sn-ps(注意:代码之前已损坏,但现在已修复并已在多台计算机上检查过),您将看到一些栅格数据的两个图。一个使用ggplot2 并生成具有高分辨率海岸线的平滑图像,这些海岸线以某种方式继承自我用来掩盖栅格的多边形。
不使用 ggplot2,我们可以使用raster::plot(... , interpolate='bilinear') 或rasterImage(interpolate = TRUE) 获得平滑后的图像。但是地图中的海岸线看起来不太好(根据栅格的分辨率,它们是锯齿状/像素化的)。您可能需要放大很多才能看到这一点。我有两个问题:
- 如何在基本图形中绘制栅格,但仅在它与多边形重叠的地方其边缘的分辨率高于栅格(产生类似于 ggplot 输出的东西)?我问这个问题in more detail here, with an example of the output I want.
- ggplot2 如何理解多边形边缘的正确位置?我看不到我在哪里/如何告诉 ggplot 掩蔽多边形是什么!
血腥细节
我在 R 中绘制一个栅格。我最初使用 ggplot2 进行绘图,使用 geom_raster(),但现在我需要切换回基本 R,因为我最终需要显示多个具有不同颜色比例的栅格一个单一的地块(这是一张地图,颜色比例最终会因大陆而异)。
下面的代码将重现绘图(包括下载必要的文件)。在我的电脑上,完整的代码(下面都是 sn-ps)大约需要 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 “知道”海岸线的位置??
【问题讨论】:
-
rasterImage(interpolate = TRUE) -
@baptiste 如何使用
rasterImage使用多边形裁剪绘图区域?我可能遗漏了一些东西,但我看不出这对我在 Edits 部分下的 Q1 中概述的问题有何帮助。我在此链接上提供了清晰(且快速执行)的困难示例(也在上面 Edits 部分的 Q1 下链接)gis.stackexchange.com/questions/233168/…
标签: r ggplot2 graphics gis r-raster