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

如何在R的pack circles气泡图中添加数值并解决多分类可读性问题

问题解决方案

一、添加气泡数值标签的实现方法

你可以直接在geom_text的label参数中拼接期刊名和对应数值,用换行符\n分隔即可同时展示两类信息,修改后的代码如下:

library(packcircles)
library(ggplot2)
library(viridis)
library(ggiraph)

packing <- circleProgressiveLayout(data$Number, sizetype='area') 
data <- cbind(data, packing) 
dat.gg <- circleLayoutVertices(packing, npoints=50) 

ggplot() + 
  geom_polygon(data = dat.gg, aes(x, y, fill=as.factor(id), colour = "black", alpha = 0.6)) +
  # 拼接期刊名和数值作为标签,换行展示
  geom_text(data = data, aes(x, y, size=Number, label = paste0(Journal, "\n", Number))) +
  # 可以适当调大字号范围,避免两行文字挤在一起
  scale_size_continuous(range = c(2,5)) +
  theme_void() + 
  theme(legend.position="none")+
  coord_equal()

如果你希望两类标签分层展示,也可以写两个geom_text图层,分别调整y轴的偏移量分开显示期刊名和数值。

二、200个分类过多导致内容无法识别的处理方案

  • 合并小值分类:提前对数据做预处理,将数值占比低于你设定阈值(比如1%)的分类统一合并为「其他」类,能直接减少大量细碎气泡,提升主要分类的辨识度
  • 选择性显示标签:仅给数值排名前N(比如前30/50)的分类设置标签,小气泡不展示静态标签,代码实现如下:
# 新增列标记是否显示标签
data$show_label <- ifelse(rank(-data$Number) <= 50, paste0(data$Journal, "\n", data$Number), "")
# geom_text中直接使用该列作为label
geom_text(data = data, aes(x, y, size=Number, label = show_label))
  • 改用交互式展示:你已经加载了ggiraph包,可以将静态图改为交互式,鼠标悬停时才显示对应气泡的完整信息,静态状态下仅保留气泡大小和配色区分,避免文字重叠。

三、适配该场景的替代可视化方案

  • 树形图(Treemap):空间利用率远高于圆形打包图,同样用面积映射数值,200个分类也能紧凑排布,R中可以通过treemapify包配合ggplot2实现
  • 排序条形图:将分类按数值大小排序后做水平条形图,如果需要展示全部分类可以配合滚动交互实现,数值对比的清晰度远高于圆形打包图
  • 加权词云:以文本大小映射数值大小,还可以按分类属性配置配色,适合展示分类与对应量级的关系

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:57:02