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

R语言中ggplot风格无位置控制气泡图的实现方案咨询

R语言中ggplot风格无位置控制气泡图的实现方案咨询

嘿,我完全懂你想要的那种气泡图——不用费心手动调整位置,气泡自动聚成一团但又不会互相碰着,还能轻松控制大小和颜色对吧?不想搞三角函数的心情我太理解了,给你推荐几个省心的方案:

方案一:用packcircles做专业圆形打包布局

这个包就是专门解决“把不重叠的圆自动摆好”的问题,完美匹配你的需求:

  1. 先安装并加载需要的包:
install.packages("packcircles")
install.packages("ggplot2")
library(packcircles)
library(ggplot2)
  1. 用你的示例数据生成布局:
birds <- c("Eagle", "Owl", "Falcon", "Ostrich", "Blue Jay", "Chaffinch")
values <- c(43, 23, 54, 112, 16, 12)
df <- data.frame(birds, values)

# 计算不重叠的圆形布局,这里用sqrt(values)作为半径,让气泡面积和数值成正比(更直观)
layout <- circleProgressiveLayout(sqrt(df$values), sizetype = "radius")
df <- cbind(df, layout)
  1. 画出ggplot风格的气泡图:
ggplot(df, aes(x, y)) +
  geom_circle(aes(r = sqrt(values), fill = birds), colour = "black") + # 控制颜色和大小
  geom_text(aes(label = birds), size = 3) + # 加上标签
  coord_equal() + # 保证圆形不被拉伸变形
  theme_void() # 去掉多余的坐标轴和背景,更清爽

这个方法会自动把所有气泡紧凑地摆在一起,完全不用你管位置,只需要调整半径和颜色参数就行。

方案二:用力导向布局实现“物理模拟”效果

如果你更喜欢用“引力+排斥”的物理逻辑来布局,试试tidygraph和ggraph的组合,模拟气泡互相吸引又不会挤在一起的效果:

  1. 安装加载包:
install.packages("tidygraph")
install.packages("ggraph")
library(tidygraph)
library(ggraph)
  1. 生成图对象并布局:
# 把数据转换成无向图(不需要边,只保留节点)
graph <- as_tbl_graph(df) %>% 
  activate(nodes) %>% 
  mutate(size = values)

# 用力导向布局,调整charge(排斥力)和gravity(向心力)控制效果
ggraph(graph, layout = "force", charge = -0.1, gravity = 0.5) +
  geom_node_point(aes(size = size, colour = birds), stroke = 1) + # 控制大小和颜色
  geom_node_text(aes(label = birds), size = 3) +
  scale_size_continuous(range = c(3, 15)) + # 自定义气泡大小的范围
  theme_void()

你可以调整charge和gravity的数值:减小charge(更负)会让气泡排斥力更强,增大gravity会让气泡更紧密地聚在一起,直到找到你满意的效果。

补充:如果非要用geom_point?

其实用geom_point也能做,但确实需要手动计算位置,要么自己写三角函数逻辑,要么用上面两个包生成的布局坐标直接喂给geom_point——但既然有现成的工具,何必自己折腾呢对吧?

备注:内容来源于stack exchange,提问作者Leonhard Euler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:59:32