在ggplot相关性散点图中添加分组凸包的技术求助
为相关性散点图添加分组凸包的解决方法
问题描述
我绘制了一张灵长类属的骨骼形状相关性散点图:X轴为跟骨PC1均值,Y轴为钩骨PC1均值,每个点对应一个属,已完成散点、属名标签、回归线及r²值的添加。现在需要给特定类群的属添加分组凸包,但操作时遇到问题。现有未添加凸包的代码如下:
ggplot(myd_,aes(x = PC1_mean_calcaneus, y = PC1_mean_hamate, label=genus)) + geom_point() + geom_text(hjust=0, vjust=0)+ # 添加每个点的属名标签 geom_smooth(method = "lm", se=FALSE) + stat_regline_equation(label.y = .6, aes(label = ..eq.label..)) + stat_regline_equation(label.y = .5, aes(label = ..rr.label..))
解决方案
要添加分组凸包,核心是利用stat_chull结合geom_polygon,前提是你的数据框myd_中存在分组列(比如命名为taxon_group,标记每个属所属的类群)。
修改后的代码示例
ggplot(myd_, aes(x = PC1_mean_calcaneus, y = PC1_mean_hamate, label=genus)) + # 先画凸包,放在底层避免遮挡散点和标签 geom_polygon( aes(group = taxon_group, fill = taxon_group), stat = "chull", alpha = 0.2, # 调整填充透明度,避免遮挡内容 color = "black" # 凸包边框颜色 ) + geom_point(aes(color = taxon_group)) # 可选:给散点按分组上色,增强区分度 geom_text(hjust=0, vjust=0) + geom_smooth(method = "lm", se=FALSE) + stat_regline_equation(label.y = .6, aes(label = ..eq.label..)) + stat_regline_equation(label.y = .5, aes(label = ..rr.label..)) + theme_bw() # 可选:添加简洁主题优化视觉效果
关键说明
- 分组列要求:确保
myd_中有区分类群的列,比如标记每个属属于人科、猴科等类群的字段。 - 图层顺序:把凸包
geom_polygon放在geom_point之前,让凸包处于底层,不会遮挡散点和标签。 - 样式自定义:通过
alpha控制填充透明度,color设置凸包边框色,fill设置填充色,可根据需求调整。 - 仅给特定类群加凸包:如果只需要给部分类群绘制凸包,可先筛选数据,示例如下:
# 仅给"人科"和"猴科"类群添加凸包 ggplot(myd_, aes(x = PC1_mean_calcaneus, y = PC1_mean_hamate, label=genus)) + geom_polygon( data = subset(myd_, taxon_group %in% c("hominidae", "cercopithecidae")), aes(group = taxon_group, fill = taxon_group), stat = "chull", alpha = 0.2, color = "black" ) + geom_point() + geom_text(hjust=0, vjust=0) + geom_smooth(method = "lm", se=FALSE) + stat_regline_equation(label.y = .6, aes(label = ..eq.label..)) + stat_regline_equation(label.y = .5, aes(label = ..rr.label..))
内容的提问来源于stack exchange,提问作者Alisha
相关产品推荐
相关产品推荐

