R绘图技巧:如何将权重占比迷你饼图作为散点绘图符号
实现方案
你可以使用R的scatterpie扩展包实现需求,该包专门适配在散点坐标位置绘制对应占比的迷你饼图,以下是完整可运行代码:
# 首次使用先安装依赖包 install.packages("scatterpie") library(scatterpie) library(ggplot2) # 你的原始示例代码 x <- seq(0, 1, length.out = 10) y <- sin(x) set.seed(10) weights <- matrix(runif(30), ncol = 3) weights <- sweep(weights, 1, apply(weights, 1, sum), "/") # 整理为绘图所需数据格式 pie_data <- data.frame( x = x, y = y, group1 = weights[,1], group2 = weights[,2], group3 = weights[,3] ) # 统一设置迷你饼图半径,可根据坐标轴范围调整 pie_radius <- 0.06
1. ggplot2体系实现(推荐效果更稳定)
ggplot() + geom_scatterpie(aes(x = x, y = y, r = pie_radius), data = pie_data, cols = c("group1", "group2", "group3")) + # 固定坐标轴比例,避免饼图被拉伸为椭圆 coord_equal() + # 自定义分组颜色,可按需修改 scale_fill_manual(values = c("group1" = "#F8766D", "group2" = "#00BA38", "group3" = "#619CFF")) + labs(x = "x", y = "sin(x)", fill = "分组占比") + theme_bw()
2. 基础绘图体系实现
# 先绘制空白画布 plot(x, y, type = "n", xlab = "x", ylab = "sin(x)") # 绘制所有位置的迷你饼图 scatterpie(x = pie_data$x, y = pie_data$y, r = pie_radius, data = pie_data, cols = c("group1", "group2", "group3"), color = "black") # 可设置为NA去掉饼图边框 # 添加图例 legend("topright", legend = c("组1", "组2", "组3"), fill = c("#F8766D", "#00BA38", "#619CFF"), title = "分组占比")
注意事项
- 必须固定坐标轴比例,否则饼图会因为x/y轴刻度缩放比例不同变形为椭圆
- 半径取值需匹配你的数据范围,数据跨度大时可适当调大,避免饼图重叠或过小
- 可通过
scale_fill_manual(ggplot2)或cols参数自定义分组颜色
内容的提问来源于stack exchange,提问作者Cinnamon
相关产品推荐
相关产品推荐

