如何将Voronoi图最外层多边形设为透明或统一颜色?
移除Voronoi图外层多边形的方案
解决外层多边形残留填充的问题,关键是先识别出超出目标范围的外层Voronoi多边形,再单独设置其填充样式。借助deldir包(ggvoronoi的底层依赖)手动生成并处理多边形数据是最可靠的方式,具体操作如下:
1. 生成Voronoi多边形数据
先用deldir生成完整的Voronoi多边形信息,转换为ggplot兼容的数据框:
require(ggplot2) require(ggvoronoi) require(deldir) set.seed(2023) N <- 80 x <- runif(N) y <- runif(N) df <- data.frame(x, y) df$dist <- rnorm(N) # 生成Voronoi多边形 voronoi_data <- deldir(df$x, df$y) vor_df <- tile.list(voronoi_data) # 转换为带原始数据dist值的数据集 vor_polygons <- lapply(seq_along(vor_df), function(i) { poly <- vor_df[[i]] data.frame( x = poly$x, y = poly$y, id = i, dist = df$dist[i] ) }) vor_polygons <- do.call(rbind, vor_polygons)
2. 标记外层多边形
判断每个多边形是否有顶点超出目标范围(这里是x∈[0.1,0.9]、y∈[0.1,0.9]),这类就是需要处理的外层多边形:
# 筛选外层多边形的ID outer_ids <- unique(vor_polygons$id[ vor_polygons$x < 0.1 | vor_polygons$x > 0.9 | vor_polygons$y < 0.1 | vor_polygons$y > 0.9 ]) # 给每条多边形顶点添加外层标记 vor_polygons$is_outer <- vor_polygons$id %in% outer_ids
3. 绘制处理后的Voronoi图
分别绘制内层和外层多边形,外层设置为透明或统一颜色:
ggplot() + # 内层多边形使用原始填充色 geom_polygon(data = vor_polygons[!vor_polygons$is_outer, ], aes(x = x, y = y, group = id, fill = dist)) + # 外层多边形设为透明(可替换为统一颜色,比如"gray90") geom_polygon(data = vor_polygons[vor_polygons$is_outer, ], aes(x = x, y = y, group = id), fill = "transparent") + # 添加Voronoi边界路径 stat_voronoi(data = df, aes(x = x, y = y), geom = "path") + # 设置显示范围 xlim(0.1, 0.9) + ylim(0.1, 0.9) + theme_void()
补充说明
- 仅用
xlim/ylim只是裁剪显示区域,但外层多边形的填充会在裁剪边缘残留,而直接识别多边形顶点范围的方法能彻底处理外层。 - 如果不需要外层多边形,也可以直接过滤掉
vor_polygons[!vor_polygons$is_outer, ]数据后绘图,无需单独绘制外层。
内容的提问来源于stack exchange,提问作者p-robot
相关产品推荐
相关产品推荐

