组合coord_proj和geom_raster

3

我正在寻找一种方法,在小比例尺地图上绘制栅格数据(使用 ggplotgeom_raster)。我想要使用 ggaltcoord_proj 来“放大” shapefile 的特定区域,但是我遇到了错误 geom_raster 只能与笛卡尔坐标一起使用

ggplot() +
    geom_polygon(data = land_df, aes(long, lat, group = group), fill = 'grey25')+
    geom_raster(data = df, aes(lon_bin, lat_bin, fill = sum_hours)) +
    coord_proj(xlim = c(-67, -63),ylim = c(0, 9))

有没有其他简单的方法使用coord_proj生成缩放的栅格地图,避免geom_raster只能使用笛卡尔坐标的限制?
我能想到的另一个选项是为每个“缩放”区域生成单独的shapefile,但我正在绘制许多这些栅格地图,而不想为每个生成单独的shapefile,而是使用coord_proj以编程方式指定栅格地图限制。
谢谢。

你能添加一些数据以帮助使其可重现吗?(coord_proj() 的作者在此)。这听起来很有趣。 - hrbrmstr
@hrbrmstr,我认为他需要使用geom_tile()而不是geom_raster(),并且在coord_proj()中没有什么可以修复的。请查看我的回答。 - Claus Wilke
@hrbrmstr 就像 Claus 所说的那样,这似乎是 geom_raster 的一个固有但不幸的特性,在这种特定情况下。 - Nate Miller
@hrbrmstr 一个快速的问题。鉴于geom_raster需要笛卡尔坐标,是否可以使用coord_proj来指定x、y边界到地图上,但是以笛卡尔坐标为基础?考虑到我正在制作国家级地图,也许可以使用笛卡尔坐标而不是像罗宾逊投影这样的投影方式。 - Nate Miller
1个回答

7
我认为你需要使用geom_tile()而不是geom_raster()geom_raster()内部使用rasterGrob,它是一个只能按线性比例缩放的位图。因此只适用于笛卡尔坐标系。 geom_tile()绘制单个矩形,可以转换为任何坐标系。
我没有你的数据集,但我可以展示一个非常简单的例子:
df <- data.frame(x = 1:100) # a very simple dataset

p_raster <- ggplot(df, aes(x, fill = x, y = 0)) + 
  geom_raster() + 
  scale_fill_distiller()

p_raster

enter image description here

p_raster + coord_polar()
## Error: geom_raster only works with Cartesian coordinates

现在有了geom_tile()函数:
# for geom_tile(), map both fill and color to avoid drawing artifacts
p_tile <- ggplot(df, aes(x, color = x, fill = x, y = 0)) + 
  geom_tile() + 
  scale_fill_distiller() +
  scale_color_distiller()

p_tile

enter image description here

p_tile + coord_polar()

enter image description here


谢谢 Claus。我避免使用 geom_tile,因为它渲染图形的速度较慢(可能是因为它绘制了单个瓷砖),而且最终产品看起来像是铺设了瓷砖(即使将瓷砖颜色和填充设置为相同),而不是平滑的表面。对于光泽漂亮的展示质量图像来说,这是不够的。然而,正如你所说,看起来这是唯一的快速选项。如果我想继续使用光栅,则可能需要追求更费力的方法。 - Nate Miller
如果geom_tile()创建了一个平铺式的结果,您可以尝试调整线条大小,看看是否有所帮助。默认设置为0.1。将其变大或变小可能会有所帮助。 - Claus Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接