首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用凹形对多边形进行逐行着色

用凹形对多边形进行逐行着色
EN

Stack Overflow用户
提问于 2022-05-01 15:19:50
回答 1查看 63关注 0票数 0

我正在修改由其他人制作的地图的代码,它使用包concaveman从点生成凹壳。其目标是绘制海洋中的多个不同的多边形,并通过分组变量对它们进行颜色编码。代码可以很好地绘制所有多边形的地图,并按身份对它们进行颜色编码:

代码语言:javascript
复制
library(sf)
library(concaveman) 
library(data.table)
library(ggplot2)

dat <- data.table(longitude = c(-131.319783, -131.141266, -131.08165, -131.079066, -130.894966, 
             -131.063783, -131.10855, -131.215533, -131.189816, -131.14565, 
             -131.200866, -131.046466, -130.94055, -130.928983, -130.7513, 
             -130.8406, -130.833433, -130.830666, -130.82205, -130.89, -63.3666666666667, 
             -63.3666666666667, -63.1666666666667, -64.1833333333333, -63.3166666666667, 
             -63.3, -63.85, -63.9333333333333, -63.9333333333333, -63.5833333333333, 
             -63.5833333333333, -63.7, -63.7, -63.2833333333333, -63.5833333333333, 
             -63.95, -64.1833333333333, -63.8833333333333, -63.8, -63.2166666666667, 
             -5.6788, -5.4408, -5.6835, -5.424, -5.6475, -5.4371, -5.6181, 
             -5.4446, -5.6753, -5.4366, -5.6746, -5.4448, -5.6642, -5.4411, 
             -5.666, -5.4408, -5.624, -5.4321, -5.6806, -5.4473),
           latitude = c(52.646633, 52.589683, 52.556516, 52.559816, 52.402916, 52.5983, 
             52.554216, 52.550883, 52.539166, 52.658216, 52.627966, 52.481733, 
             52.486033, 52.469033, 52.469166, 52.261833, 52.292133, 52.301066, 
             52.3523, 52.366966, 48.4666666666667, 48.4666666666667, 48.65, 
             49.0166666666667, 48.8166666666667, 48.8166666666667, 49.1, 48.8666666666667, 
             48.8666666666667, 48.8, 48.8166666666667, 48.4833333333333, 48.4833333333333, 
             48.8, 48.8166666666667, 48.8833333333333, 49.05, 49.0833333333333, 
             48.7166666666667, 48.6666666666667, 54.7201, 54.6033, 54.7191, 
             54.5733, 54.7225, 54.5923, 54.7261, 54.6076, 54.719, 54.5978, 
             54.7195, 54.6108, 54.7204, 54.6062, 54.7214, 54.5923, 54.7275, 
             54.592, 54.7207, 54.6188),
           group = c(rep('NEPac',20),rep('NWAtl',20),rep('NEAtl',20))
           )

split <- split(dat, dat$group)
split.sf <- lapply(split, st_as_sf, coords = c("longitude", "latitude"))
concave <- lapply(split.sf, concaveman, concavity = 3, length_threshold = 2)
concave.binded <- do.call('rbind', concave)
concave.spdf <- as_Spatial(concave.binded)

ggplot() +
  geom_polygon(data = concave.spdf,
               aes(x = long, y = lat, group = group, fill = group, color = group)) 

然而,我想不出如何用group以外的任何东西填充多边形。以下是我的尝试:

代码语言:javascript
复制
concave.spdf$ocean <- c('P','A','A')

ggplot() +
  geom_polygon(data = concave.spdf,
               aes(x = long, y = lat, group = group, fill = ocean, color = ocean)) 

抛出此错误:Error in FUN(X[[i]], ...) : object 'ocean' not found

我认为问题是,当传递给split时,concaveman会根据标识对多边形进行分组,但是如果我改变了这一点,它们就不会正确地绘制(因为不同多边形的点将被合并)。如何保持多边形单独绘制,但用分组变量对其进行着色?(如果可能的话,我更愿意在真实的情节中坚持使用concaveman,因为它比这个reprex复杂得多--我知道,如果我用另一种方法绘制多边形,这会更容易。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-01 16:21:13

最简单的方法是添加一个scale_fill_manual

代码语言:javascript
复制
ggplot() +
  geom_polygon(data = concave.spdf,
               aes(x = long, y = lat, group = group, fill = group)) +
  scale_fill_manual(values = c("red", "green", "blue"),
                    labels = c("Ocean 1", "Ocean 2", "Ocean 3"))

可以说,更好的方法是将其转换为一个简单的特性集合,您可以在其中添加任何您喜欢的列,然后使用geom_sf自动绘制

代码语言:javascript
复制
concave.spdf <- st_as_sf(concave.spdf)
concave.spdf$ocean <- c("Ocean 1", "Ocean 2", "Ocean 3")

ggplot(concave.spdf) +
  geom_sf(aes(fill = ocean))

请注意,这会自动给出正确的协调比例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72078001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档