如何使用skbio基于JSD距离矩阵绘制二维PCoA可视化图
解决方案
首先明确:可以直接通过Skbio实现2D PCoA图绘制,不需要额外引入其他工具,两种实现方案如下:
方案1:直接调用skbio内置plot方法指定坐标轴
skbio的OrdinationResults.plot()方法支持通过axes参数指定需要可视化的主坐标轴索引,要绘制PC1和PC2的二维图,只需要传入axes=[0,1]即可(索引从0开始,对应排序第一、第二的主坐标),修改后代码如下(已修正原代码中matplotlib导入的拼写错误):
import matplotlib.pyplot as plt from skbio import DistanceMatrix from skbio.stats.ordination import pcoa # 加载距离矩阵到skbio格式 dm = DistanceMatrix(matrix, ids=sample_names) plt.style.use('ggplot') pcoa_results = pcoa(dm) # 指定axes参数选择前两个轴绘制二维图 fig = pcoa_results.plot(df=groups, column='Cluster', cmap='Set1', s=50, axes=[0,1]) plt.show()
如果需要自定义坐标轴标签、标题等样式,因为返回的是matplotlib的figure对象,可以直接用matplotlib的原生方法修改即可,比如给坐标轴加上解释度:
ax = fig.gca() # 从pcoa结果中提取解释度百分比 pco1_exp = round(pcoa_results.proportion_explained[0]*100, 2) pco2_exp = round(pcoa_results.proportion_explained[1]*100, 2) ax.set_xlabel(f'PCo1 ({pco1_exp}%)') ax.set_ylabel(f'PCo2 ({pco2_exp}%)') ax.set_title('JSD距离PCoA分析') plt.show()
方案2:手动提取坐标自定义绘制(自由度更高)
如果内置plot方法的样式不能满足你的需求,可以直接从pcoa_results.samples中提取所有样本的主坐标值,结合matplotlib/seaborn完全自定义绘图,示例代码如下:
import seaborn as sns import pandas as pd # 提取PC1、PC2坐标,合并分组信息 pcoa_df = pd.DataFrame(data = pcoa_results.samples.values[:, :2], columns = ['PCo1', 'PCo2'], index = sample_names) pcoa_df = pcoa_df.join(groups['Cluster']) # 自定义绘制 plt.figure(figsize=(8,6)) sns.scatterplot(data=pcoa_df, x='PCo1', y='PCo2', hue='Cluster', palette='Set1', s=50) # 添加解释度标签 pco1_exp = round(pcoa_results.proportion_explained[0]*100, 2) pco2_exp = round(pcoa_results.proportion_explained[1]*100, 2) plt.xlabel(f'PCo1 ({pco1_exp}%)') plt.ylabel(f'PCo2 ({pco2_exp}%)') plt.title('JSD距离PCoA分析') plt.legend(title='Cluster') plt.show()
其他可选工具
如果后续有更复杂的可视化需求,也可以使用以下工具:
scikit-bio本身已经可以覆盖绝大多数排序分析需求qiime2内置的可视化模块,适合微生物组全流程分析场景vega/plotly可以生成交互式PCoA图
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

