如果您同时运行下面的两个代码段(注意:代码先前已损坏,但现在已修复且已在多台计算机上检查),您将看到两个栅格数据图。一个人使用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屏蔽更大的光栅而产生的。因此,按重要性重新陈述问题:
Q1。如何在基础R中创建此高分辨率图?
Q2。 ggplot如何“知道”海岸线的位置基于我传递给它的data.frame?
答案 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
自动“降低”分辨率以节省你的记忆有关。