有没有一种方法可以删除ggploy外部的空格? [英] Is there a way to remove the whitespace outside of a ggplot?
问题描述
我使用代码创建一个静态地图,并将其包含在一个闪亮的应用程序中。我有一个问题,那里的地块大小比实际的地块大得多,所以布局看起来不太对劲。有什么方法可以减少绘图外部的空白吗?
如果可能,我希望输出仅为绘图本身。
# 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屋!