使用ggplot2与ggforce绘制采样示意图的技术问题求助
采样方案示意图优化方案
一、调整geom_mark_rect参数解决问题
针对包围盒不贴合、窄图重叠的问题,直接修改geom_mark_rect的参数就能快速优化:
- 缩小
expand值至0.01,减少额外留白 - 设置
radius=0去掉圆角,避免不必要的空间占用 - 明确分组映射,确保每个点组的包围盒单独计算
- 关闭自动缓冲(
buffer=0),让盒子紧贴点集
修改后的代码片段:
geom_mark_rect( aes(group = interaction(Time, chart_num, Location)), expand = 0.01, radius = 0, buffer = 0 )
二、手动绘制矩形(更精准可控)
如果geom_mark_rect仍达不到预期,直接手动计算每个分组的边界,用geom_rect绘制,完全自定义大小:
步骤1:提前计算分组边界
先对数据按Location、chart_num、Time分组,计算x和y的极值并小幅扩展:
library(dplyr) rect_data <- data_forchart %>% group_by(Location, chart_num, Time) %>% summarise( xmin = min(Time) - 0.05, xmax = max(Time) + 0.05, ymin = as.numeric(chart_num) - 0.1, ymax = as.numeric(chart_num) + 0.1, .groups = "drop" )
步骤2:替换geom_mark_rect为geom_rect
把原代码里的geom_mark_rect换成geom_rect,使用计算好的边界数据:
sample_schema <- ggplot() + # 先画矩形(避免覆盖点) geom_rect( data = rect_data, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = Time), alpha = 0.2 # 调整透明度避免遮挡点 ) + # 再画散点 geom_beeswarm( data = data_forchart, aes(x = Time, y = chart_num, shape = Location, color = Time), cex = 2, size = 3 ) + # 后续样式设置保持不变 scale_shape_manual(values = c(15, 17, 16)) + viridis::scale_color_viridis(discrete=TRUE, begin = 0, end = .97, direction = -1) + viridis::scale_fill_viridis(discrete=TRUE, begin = 0, end = .97, direction = -1) + facet_grid(Location ~., scales = "free_y", space = "free_y", switch = "y", labeller = labeller(Location = facet.labs)) + theme_void(base_size = 16) + theme(legend.position = "none") + theme(strip.text.y.left = element_text(angle = 0, hjust = 1, vjust = .9))
这种方法完全可控,无论绘图宽度多窄,都不会出现重叠,且能精准贴合点集。
内容的提问来源于stack exchange,提问作者user21177283
相关产品推荐
相关产品推荐

