我想制作如下图所示的气泡图。
我的想法是有一个 ggplot 风格的气泡图,我真正想要控制的是图表的大小和颜色,而不是真正控制位置。气泡应该以指定的半径相互簇拥,以防止它们接触。
是否有特定的 ggplot 函数或 R 包可以为我做这个?我确定可以使用 geom_point() 来制作一个,但必须想象有一种更简单的方法,我宁愿在一天中的这个时候不做触发。
任何指示?
另一个解决方案可能是使用物理学。让所有气泡通过“重力”相互吸引,然后在它们彼此靠得太近时停止。这可能意味着涉及的数学更少。即使有一个包,由比我更擅长工作类型的人快速编码的版本也很高兴看到。
输入应该是这样的:
birds <- c("Eagle", "Owl", "Falcon", "Ostrich", "Blue Jay", "Chaffinch")
values <- c(43, 23, 54, 112, 16, 12)
df <- data.frame(birds, values)
编辑:我确定这将被标记为重复问题,但我已经尽我最大的努力在网上和堆栈上找到我要找的东西,但我还没有找到。如果您确定重复,请仅将其标记为重复。如果您不确定,请让其他人回答。
使用@JonSpring 评论的圆形包装库,代码从文档中修改
df <- data.frame(birds = c("Eagle", "Owl", "Falcon", "Ostrich", "Blue Jay", "Chaffinch"),
values = c(43, 23, 54, 112, 16, 12))
library(ggplot2)
install.packages("packcircles")
library(packcircles)
df$packing <- circleProgressiveLayout(df$values, sizetype='area')
df.gg <- circleLayoutVertices(df$packing, npoints=50)
ggplot() +
geom_polygon(data = df.gg, aes(x, y, group = id, fill=id), alpha = 0.6)+
scale_fill_viridis_c()+
geom_text(data = df, aes(x=packing$x, y=packing$y, label = birds), size=5, color="black") +
theme_void() +
theme(legend.position="none", plot.margin=unit(c(0,0,0,0),"cm") ) +
coord_equal()
原答案:
从重构问题的角度来看,
wordcloud
库可以避免文本重叠:
df <- data.frame(birds = c("Eagle", "Owl", "Falcon", "Ostrich", "Blue Jay", "Chaffinch"),
values = c(43, 23, 54, 112, 16, 12))
install.packages("wordcloud")
library(wordcloud)
wordcloud(df$birds, df$values, colors=brewer.pal(8,"Dark2"))