如何用ggrough独立控制地图填充与边框的粗糙度
解决ggrough中sf图层填充与边框粗糙度独立设置的问题
方案一:叠加图层实现分离控制
这是最直接的可行方案,通过两个独立的geom_sf图层分别处理填充和边框,各自应用不同的粗糙度(或不应用):
- 先绘制仅包含填充的图层,应用高粗糙度(30)处理
- 再绘制仅包含边框的图层,应用低粗糙度(如5)或不应用粗糙效果
示例代码:
library(ggplot2) library(sf) library(ggrough) # 加载北卡罗来纳州郡数据 nc <- st_read(system.file("shape/nc.shp", package = "sf")) # 构建图形 ggplot() + # 粗糙填充图层:仅显示填充,隐藏边框 geom_sf(data = nc, aes(fill = AREA), color = NA) + geom_rough(roughness = 30, geom = "sf") + # 低粗糙边框图层:仅显示边框,隐藏填充 geom_sf(data = nc, fill = NA, color = "black", size = 0.5) + geom_rough(roughness = 5, geom = "sf") + # 可选:调整填充配色 scale_fill_viridis_c()
如果需要完全平滑的边框,只需去掉第二个图层的geom_rough即可:
ggplot() + geom_sf(data = nc, aes(fill = AREA), color = NA) + geom_rough(roughness = 30, geom = "sf") + geom_sf(data = nc, fill = NA, color = "black", size = 0.5) + scale_fill_viridis_c()
方案二:修改parse_sf函数实现参数分离
如果你想从底层实现填充与边框的粗糙度独立控制,可以修改自定义的parse_sf函数,让它支持分别接收fill_roughness和color_roughness参数:
parse_sf <- function(data, rough_args) { # 处理填充的多边形粗糙度 fill_rough <- rough_args$fill_roughness %||% rough_args$roughness fill_geom <- lapply(data$geometry, function(x) { roughsf::roughsf(x, roughness = fill_rough, max_offset = 0.01) }) fill_data <- data fill_data$geometry <- st_sfc(fill_geom) # 处理边框的线粗糙度 color_rough <- rough_args$color_roughness %||% rough_args$roughness color_geom <- lapply(data$geometry, function(x) { roughsf::roughsf(st_cast(x, "MULTILINESTRING"), roughness = color_rough, max_offset = 0.005) }) color_data <- data color_data$geometry <- st_sfc(color_geom) list(fill = fill_data, color = color_data) } # 调用时指定不同参数 ggplot(nc) + geom_sf(aes(fill = AREA), color = "black") + geom_rough(fill_roughness = 30, color_roughness = 5, geom = "sf")
为什么之前的双图层尝试失败?
大概率是因为你没有将填充和边框的显示状态分开(比如同时显示了两个图层的填充/边框),或者没有为每个图层单独指定geom_rough的粗糙度参数。确保每个图层只负责一个视觉元素(填充或边框),并对应设置粗糙效果即可。
内容的提问来源于stack exchange,提问作者bill999
相关产品推荐
相关产品推荐

