如果您运行下面的两个代码片段(注意:代码以前被破坏,但现在已修复并已在多台计算机上检查过),您将看到一些栅格数据的两个图。一种使用ggplot2
并生成具有高分辨率海岸线的平滑图像,这些海岸线以某种方式从我用来遮罩栅格的多边形中继承而来。
在不使用 ggplot2 的情况下,我们可以使用raster::plot(... , interpolate='bilinear')
或获得平滑的图像rasterImage(interpolate = TRUE)
。但是地图中的海岸线看起来不太好(根据栅格的分辨率,它们呈锯齿状/像素化)。您可能需要放大很多才能看到这一点。我有两个问题:
我正在 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 掩蔽更大的栅格而生成的。因此,按重要性顺序重新陈述问题:
一季度。如何在基础 R 中创建此高分辨率图?
Q2。ggplot 到底是怎么“知道”海岸线基于我传递给它的 data.frame 的?
既然你说这ggplot
需要大量内存plot
而不需要,我认为像素化来自这样一个事实,即raster::plot
默认情况下实际上只采用像素的一个子集来减少内存占用,具体取决于参数maxpixels
:
maxpixels 整数 > 0。用于绘图的最大单元格数。如果 maxpixels < ncell(x),则在绘图前使用 sampleRegular。如果 gridded=TRUE maxpixels 可能会被忽略以获得更大的样本
我会尝试类似的东西:
plot(msrP2, interpolate='bilinear', maxpixels=50000000)
看看它是否能解决你的问题。
PS:关注 Q2:ggplot2
对“海岸线”一无所知。如果我是对的,那么您所看到的问题仅与raster::plot
自动“降低”分辨率以节省您的内存有关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句