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

雅各布·索科拉尔(Jacob Socolar)

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

现在,以高保真度再现海岸线!归根结底,其原因一定与以下事实有关:该栅格最初是通过使用大陆和湖泊的高分辨率 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ggplot2在geom_raster中结合了连续变量和离散变量

在ggplot2的geom_raster中删除特定的轴刻度

如何在R中的geom_raster ggplot中添加州和县线?

在ggplot geom_raster中具有不同斜率的逻辑回归之间进行插值

有没有一种方法可以使用geom_raster在ggplot2中的矩形周围创建边框?

geom_raster如何处理重复填充?

将 geom_raster 导出为具有特定像素尺寸/无 ggplot 边框的 tiff

如何删除geom_raster中连续x值之间的空间/间隙

更改 geom_raster 中的色带以更好地显示异常值

ggplot2是否使用/继承R基本图形中的某些参数?

在ggplot2中,如何限制geom_hline的范围?

如何翻转ggplot2中的geom_curve(箭头)?

如何更改ggplot2中特定geom的大小?

在 ggplot 中使用 geom_raster 函数,我将我的数据转换为数据框,但它不起作用

如何让geom_text继承主题规范?(ggplot2)

如何让 geom_text 与 ggplot2 左对齐

从图例中删除ggplot2的geom_point图标

ggplot2中的背景条使用geom_rect

ggplot2中的背景条使用geom_rect

在ggplot2`geom_hex()`中设置z限制

在ggplot2中的geom_segment旁边添加文本

ggplot2中geom_step中线条的边框

ggplot2中的geom_quantile完整范围

在ggplot2的geom_boxplot中删除边框

ggplot2::geom_tile 中的单级变量

ggplot2 2.0.0中的geom_point边界

在ggplot2中的geom_bar上重叠文本

ggplot2中的希腊符号:geom_boxplot

在ggplot2中重置update_geom_defaults()