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

如何在ggplot中让点围绕中心坐标圆形聚类以避免重叠

解决方法

你需要的是围绕固定中心点的圆形散点排布,有两种常用实现方式:

方案1:使用ggbeeswarm包(最简实现)

ggbeeswarm包的geom_beeswarm支持圆形排布逻辑,可直接控制散布范围,不会出现jitter的过度分散问题:

# 先安装依赖包
install.packages("ggbeeswarm")
library(ggplot2)
library(ggbeeswarm)

data <- data.frame(lon = c(rep(-100, 15), rep(-98, 10), rep(-96, 8)),
                   lat = c(rep(50, 15), rep(58, 10), rep(46, 8)),
                   n = runif(33, 0, 300))

ggplot(data=data, aes(x=lon, y=lat, color=n)) + 
  # cex参数控制散布范围,数值越大聚类半径越大
  geom_beeswarm(cex = 2, priority = "random")

调整cex参数即可控制聚类的整体大小,priority = "random"会让点的分布更接近均匀圆形。

方案2:手动生成圆形偏移(无需额外包)

如果不想引入第三方依赖,可以自行通过极坐标转直角坐标的方式生成偏移量,完全可控排布逻辑:

library(dplyr)
library(ggplot2)

data <- data.frame(lon = c(rep(-100, 15), rep(-98, 10), rep(-96, 8)),
                   lat = c(rep(50, 15), rep(58, 10), rep(46, 8)),
                   n = runif(33, 0, 300))

# 为每个坐标组的点生成圆形偏移
data_offset <- data %>%
  group_by(lon, lat) %>%
  mutate(
    # 随机生成0-2π的角度
    angle = runif(n(), 0, 2*pi),
    # 随机半径,最大值0.2可根据需求调整,控制聚类范围
    radius = runif(n(), 0, 0.2),
    # 转换为经纬度偏移后的坐标
    lon_plot = lon + radius * cos(angle),
    lat_plot = lat + radius * sin(angle)
  ) %>%
  ungroup()

# 绘图
ggplot(data_offset, aes(x=lon_plot, y=lat_plot, color=n)) +
  geom_point() +
  # 可选:添加原始坐标中心点标记
  geom_point(aes(x=lon, y=lat), shape = 3, color = "black", size = 2)

补充:如果可以接受矩形分布,其实原生geom_jitter也可以通过调整width和height参数控制分散范围,比如geom_jitter(width = 0.2, height = 0.2),只是分布形状不是圆形。

内容的提问来源于stack exchange,提问作者OKLM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 01:42:02