gpt4 book ai didi

r - ggplot2 - 如何用颜色填充嵌套的多边形?

转载 作者:行者123 更新时间:2023-12-01 11:16:03 25 4
gpt4 key购买 nike

我在一个独特的 SpatialPolygonsDataFrame 中有 > 100 个嵌套的多边形。我想用 ggplot2 绘制它们并且它们都需要在 map 中可见,即覆盖更大的多边形必须在背景中。

我发现我可以通过在 geom_polygon 函数中使用 alpha = 0 来实现这一点,但是我如何为每个多边形分配填充颜色?

这里是我的代码示例,只有 2 个多边形:

library(ggplot2)

读取合并了两个 shapefile 的 csv 文件,然后使用 maptools 中的 fortify 将其转换为 data.frame。

#read csv file shape_1_2.csv
shape_1_2 = read.csv('shape_1_2.csv', stringsAsFactors = FALSE)

#plot
ggplot() +
geom_polygon(data = shape_1_2, aes(x = long, y = lat, group = group),
colour = 'black', size = 1, linetype = 'solid', alpha = 0)

及相关图:

enter image description here

如何为这两个多边形填充颜色?

我尝试在 aesgeom_polygon 中添加 fill='black' 但它不起作用。

谢谢


更新

很抱歉,我意识到我的示例数据不包含嵌套多边形。

因此根据 https://gis.stackexchange.com/questions/280671/r-create-multipolygon-from-overlapping-polygons-using-sf-package 从以下 data.frame 开始:

shape_df = data.frame(
lon = c(0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 2, 0.8, 1, 1, 2, 2, 1, 1),
lat = c(0, 0, 1, 1.5, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 0, 0, 1, 1, 0),
var = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3 ,3 ,3 ,3 ,3, 4 ,4 ,4, 4, 4)
)

还有我的绘图代码(alpha=0):

ggplot() +
geom_polygon(data = shape_df, aes(x = lon, y = lat, group = var),
colour = 'black', size = 1, linetype = 'solid', alpha = 0)

附相关 map :

enter image description here

如何使用一种或最多 4 种颜色填充 map 中存在的不同区域,以便较大的多边形保留在较小的多边形背景中?

最佳答案

如果您使用 sf 执行此操作,您可以使用 st_area 来获取每个多边形的面积(面积对于未投影的玩具数据没有多大意义,但对实际形状有意义),然后根据面积对多边形进行排序。这样,ggplot 将按 ID 顺序创建多边形。 要使用geom_sf,您需要github dev version of ggplot2 ,虽然它被添加到下一个 CRAN 版本中,slated for next month (July 2018) .

首先从数据中创建一个简单的特征集合。在这种情况下,我必须使用 summarise(do_union = F) 将每个系列的点按正确的顺序 (per this recent question) 制作成一个多边形,然后计算每个点的面积。

library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.1.3, proj.4 4.9.3

shape_df <- data.frame(
lon = c(0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 2, 0.8, 1, 1, 2, 2, 1, 1),
lat = c(0, 0, 1, 1.5, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 0, 0, 1, 1, 0),
var = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3 ,3 ,3 ,3 ,3, 4 ,4 ,4, 4, 4)
)

shape_areas <- shape_df %>%
st_as_sf(coords = c("lon", "lat")) %>%
group_by(var) %>%
summarise(do_union = F) %>%
st_cast("POLYGON") %>%
st_cast("MULTIPOLYGON") %>%
mutate(area = st_area(geometry)) %>%
mutate(var = as.factor(var))

shape_areas
#> Simple feature collection with 4 features and 3 fields
#> geometry type: MULTIPOLYGON
#> dimension: XY
#> bbox: xmin: 0 ymin: 0 xmax: 2 ymax: 2
#> epsg (SRID): NA
#> proj4string: NA
#> var do_union area geometry
#> 1 1 FALSE 1.25 MULTIPOLYGON (((0 0, 1 0, 1...
#> 2 2 FALSE 1.00 MULTIPOLYGON (((0 1, 1 1, 1...
#> 3 3 FALSE 1.10 MULTIPOLYGON (((1 1, 2 1, 2...
#> 4 4 FALSE 1.00 MULTIPOLYGON (((1 0, 2 0, 2...

如果我此时绘制,该区域与绘制顺序无关;它只是按 var 排序,数字:

shape_areas %>%
ggplot() +
geom_sf(aes(fill = var), alpha = 0.9)

但是,如果我使用 forcats::fct_reorder 通过减小面积来重新排序 var 作为一个因素,多边形将按顺序绘制,最大的多边形位于底部,并且较小的多边形在顶部分层。 编辑: 正如@SeGa 在下面指出的那样,这最初是在顶部放置较大的形状。使用 -areadesc(area) 降序排列。

shape_areas %>%
mutate(var = var %>% fct_reorder(-area)) %>%
ggplot() +
geom_sf(aes(fill = var), alpha = 0.9)

reprex package 创建于 2018 年 6 月 30 日(v0.2.0)。

关于r - ggplot2 - 如何用颜色填充嵌套的多边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51078151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com