phyloseq包plot_ordination绘图形状重复及填充失效问题求助
解决phyloseq中plot_ordination绘制PCoA图的形状重复与填充问题
1. 修复形状重复绘制的问题
你的代码里重复调用了geom_point()——plot_ordination()函数默认已经添加了一层点图层,再次叠加geom_point()会导致同一个样本点被绘制两次,出现大小不一的视觉效果。直接移除额外的geom_point()即可解决:
ord_bc_pcoa <- ordinate(physeq, method="PCoA", distance="bray") pcoa_plot_1 <- plot_ordination(physeq, ord_bc_pcoa, color="variable1", shape="variable2") + scale_color_manual(values = c("var1X"="red","var1Y"="#55BE25","var1Z"="blue")) + # 修正原代码中重复的var2D和拼写错误的varF scale_shape_manual(values = c("var2A"=0,"var2B"=2,"var2C"=3,"var2D"=4,"var2E"=5,"var2F"=6,"var2G"=7,"var2H"=8)) + ggtitle("title1") pcoa_plot_1
2. 解决填充形状无法正常填充的问题
phyloseq的plot_ordination()默认仅映射color到点的轮廓颜色,带填充的形状(如代码21-25)需要单独指定fill映射,并配合scale_fill_manual设置填充色:
pcoa_plot_fill <- plot_ordination(physeq, ord_bc_pcoa, color="variable1", shape="variable2", fill="variable1") + # 设置点的轮廓颜色(可统一为黑色增强区分度) scale_color_manual(values = c("var1X"="black","var1Y"="black","var1Z"="black")) + # 设置填充色 scale_fill_manual(values = c("var1X"="red","var1Y"="#55BE25","var1Z"="blue")) + # 选用支持填充的形状代码(21-25均为带填充的形状) scale_shape_manual(values = c("var2A"=22,"var2B"=23,"var2C"=24,"var2D"=25,"var2E"=21,"var2F"=22,"var2G"=23,"var2H"=24)) + ggtitle("PCoA (Bray-Curtis) with filled shapes") + theme_bw() pcoa_plot_fill
若需要用不同变量控制填充和轮廓颜色,只需将fill参数替换为对应的分组变量即可。
3. 完全可控的替代方案:手动提取坐标用ggplot2绘图
如果phyloseq的封装函数限制过多,可以直接从PCoA结果中提取坐标,结合样本元数据手动绘图,实现100%自定义:
# 提取PCoA前两轴的坐标 pcoa_df <- as.data.frame(ord_bc_pcoa$vectors[,1:2]) colnames(pcoa_df) <- c("PC1", "PC2") # 合并样本元数据 pcoa_df <- cbind(pcoa_df, sample_data(physeq)) # 用ggplot2手动绘制 library(ggplot2) ggplot(pcoa_df, aes(x=PC1, y=PC2, color=variable1, shape=variable2, fill=variable1)) + geom_point(size=4) + scale_color_manual(values = c("var1X"="black","var1Y"="black","var1Z"="black")) + scale_fill_manual(values = c("var1X"="red","var1Y"="#55BE25","var1Z"="blue")) + scale_shape_manual(values = c("var2A"=22,"var2B"=23,"var2C"=24,"var2D"=25,"var2E"=21,"var2F"=22,"var2G"=23,"var2H"=24)) + ggtitle("title1") + theme_bw() + # 添加轴标签,包含解释率 labs(x=paste0("PC1 (", round(ord_bc_pcoa$values$Relative_eig[1]*100,1), "%)"), y=paste0("PC2 (", round(ord_bc_pcoa$values$Relative_eig[2]*100,1), "%)"))
内容的提问来源于stack exchange,提问作者RobH
相关产品推荐
相关产品推荐

