R语言绘制不同位置与尺寸的自定义多饼图
R绘制大小映射总丰度的分组多饼图
你要的这种「x轴为采样位点、y轴为采样水深,饼图大小对应该位点该深度下所有动物总计数、扇区占比对应当前样本三类动物组成」的图,用scatterpie包实现最直接,不用手动计算饼图坐标,代码可复现性也高。
实现逻辑
- 先加载需要的依赖包,预处理数据:按「采样位点+水深」分组计算每个样本的总计数,再把长表转成宽表适配散点饼图的输入格式
- 映射坐标轴:x轴对应Position列,y轴对应Depth列(常规水深可视化建议反转y轴,让浅水层在图的上方,深水层在下方)
- 映射视觉属性:饼图半径绑定总计数,扇区填充绑定三个动物类群,调整缩放系数避免饼之间重叠
完整可运行代码
# 加载依赖包,没装的先运行install.packages(c("tidyverse","scatterpie"))安装 library(tidyverse) library(scatterpie) # 读入示例数据集 df <- read.table(text="Position Depth Group Value A 50 G1 30 A 50 G2 60 A 50 G3 10 A 200 G1 10 A 200 G2 10 A 200 G3 30 B 50 G1 24 B 50 G2 48 B 50 G3 8 B 100 G1 8 B 100 G2 8 B 100 G3 24 C 100 G1 36 C 100 G2 72 C 100 G3 12 C 600 G1 12 C 600 G2 12 C 600 G3 36", header=TRUE) # 数据预处理 df_plot <- df %>% group_by(Position, Depth) %>% mutate(total_count = sum(Value)) %>% # 计算每个样本的总计数,用来映射饼大小 ungroup() %>% pivot_wider(names_from = Group, values_from = Value) # 转宽表适配scatterpie输入要求 # 绘图 ggplot() + geom_scatterpie( aes(x = Position, y = Depth, r = total_count/220), # 除以220是半径缩放系数,根据实际效果调整 data = df_plot, cols = c("G1", "G2", "G3"), # 指定构成扇区的列 color = "white", # 扇区间加白色分隔线 linewidth = 0.5 ) + # 自定义类群配色,可按需替换 scale_fill_manual( values = c("G1" = "#E64B35", "G2" = "#4DBBD5", "G3" = "#00A087"), name = "动物类群" ) + # 反转y轴,符合水深从上到下加深的展示逻辑,不需要可以删掉这行 scale_y_reverse(breaks = unique(df$Depth), name = "采样水深") + scale_x_discrete(name = "采样位点") + # 固定坐标比例,保证饼图是正圆不会拉伸变形 coord_equal() + theme_bw(base_size = 12) + theme( panel.grid = element_blank(), legend.position = "right" )
参数调整说明
- 半径缩放系数:代码里
r = total_count/220的分母可以自己改,分母越小饼整体越大,分母越大饼越小,调整到相邻饼不重叠即可 - 如果需要固定饼的大小区间,可以追加
scale_radius(range = c(0.1, 0.8)),括号里的两个值分别对应最小、最大饼的半径比例 - 配色、字体、主题元素都可以按自己的绘图需求修改,和普通ggplot2图层的调整逻辑完全一致
内容的提问来源于stack exchange,提问作者Jellz
相关产品推荐
相关产品推荐

