You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:02:52