有没有一种方法可以删除ggploy外部的空格? [英] Is there a way to remove the whitespace outside of a ggplot?

查看:10
本文介绍了有没有一种方法可以删除ggploy外部的空格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用代码创建一个静态地图,并将其包含在一个闪亮的应用程序中。我有一个问题,那里的地块大小比实际的地块大得多,所以布局看起来不太对劲。有什么方法可以减少绘图外部的空白吗?

如果可能,我希望输出仅为绘图本身。

# reprex
library(terra)
library(sf)
library(magrittr)
library(ggplot2)

lux <- vect(system.file("ex/lux.shp", package = "terra"))

p <- lux %>% 
  st_as_sf() %>%
  ggplot() +
  geom_sf(aes(fill = NAME_2), colour = "white", size = 0.2) +
  theme(legend.position = "None") +
# found online - removes the whitespace around the plot but not the external whitespace
  theme(plot.margin=grid::unit(c(0,0,0,0), "mm")) 

p

推荐答案

绘图包含空白的原因是geom_sf()对坐标系施加的约束。绘图的纵横比通常会自动调整以适应典型绘图中的窗口大小,但在Shapefile(sf)的情况下,纵横比由特定的coordinate reference system或与该特定投影关联的CRS确定。您以前在地图中看到过这种情况,在地图中,由于试图将地球表面投影到2D平面上,每个地图都会发生扭曲。

因此,geom_sf()会生成具有适当纵横比的贴图。如果查看窗口或输出图像与纵横比不匹配,则需要在两侧或顶部留出空白进行补偿。因此,解决问题的方法是更改绘图的纵横比(这看起来不正确,也不是一个好主意),或者使输出图像或窗口与绘图的纵横比匹配。

TL;DR-使用tmaptools::get_asp_ratio()获取绘图对象的纵横比,然后使用该纵横比保存绘图图像。

现在查看一些说明性图片,这些图片有助于说明geom_sf()geom_polygon()的运行方式不同的原因,以及如何解决具有代表性的示例中的问题。

使用geom_polygon()

的地图

除非您使用coord_fixed()固定绘图区域的比例,否则geom_polygon()将始终随着输出纵横比的更改而挤压和拉伸。

library(ggplot2)

my_map <- map_data("usa")
p1 <-
  ggplot(my_map, aes(long, lat)) +
  geom_polygon(aes(group=group), fill='white', color='black') +
  ggtitle('USA Using geom_polygon()')

这是一张正方形地图:

ggsave('p1_square.png', plot=p1, width=5, height=5)

这是一个矩形地图:

ggsave('p1_rect.png', plot=p1, width=15, height=5)

使用geom_sf()

映射

相比之下,您可以看到geom_sf()的贴图始终保持其纵横比,而不考虑输出的大小。

library(sf)

world1 <- sf::st_as_sf(map('usa', plot = FALSE, fill = TRUE))
p2 <-
  ggplot() + geom_sf(data = world1, fill='white') + ggtitle('USA Using geom_sf()')

平方输出:

ggsave('p2_square.png', plot=p2, width=5, height=5)

矩形输出:

ggsave('p2_rect.png', plot=p2, width=15, height=5)

如何删除空格?

所以,现在应该很明显为什么您有空格...但是如何删除它?答案是,您需要使用sf对象使用的CRS所提供的相同纵横比保存绘图。你需要的是一种获得这些信息的方法。sf包中的函数st_crs()可以获取您的shapefile使用的CRS的名称,但它不能直接给出纵横比。为此,您可以使用tmaptools库中的get_asp_ratio()函数,然后使用该函数来计算宽度/高度。这里需要注意的是,我们需要对sf对象使用<2-14]>,而不是对绘图对象使用。在本例中,它是world1而不是p2

plot_ratio <- get_asp_ratio(world1)
ggsave('p2_perfect.png', plot=p2, width = plot_ratio*5, height=5)

这为我们提供了与地图的纵横比完全匹配的绘图输出:

这篇关于有没有一种方法可以删除ggploy外部的空格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆