
代码绘制成果展示



图上的每一个点代表一个受试者样本 。空间上越靠近的两个点,说明这两个样本的群结构越相似;离得越远,说明差异越大。不同颜色代表不同组样本。坐标轴(PCoA1 和 PCoA2)分别是解释样本间差异排名前两位的“主坐标”。括号里的百分比(如 PCoA1 11.85%)表示该坐标轴所能解释的数据总体变异的百分比。数值越大,说明该方向上的区分度越强。椭圆圈代表该组别数据的95%置信区间。左上角的文本是PERMANOVA的统计检验结果。











代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchesfrom matplotlib.lines import Line2Dfrom scipy.stats import chi2

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#F18C79', '#6AC2D6', '#8FCA81', '#F5C05F', '#D196CA', '#8C8C8C'],}

第三部分

# =========================================================================================# ======================================3.置信椭圆绘制函数=======================================# =========================================================================================def add_confidence_ellipse(ax, points, color):#检查样本数if len(points) < 3:returnellipse_width = 2 * np.sqrt(chi2.ppf(0.95, 2)) * np.sqrt(eigenvals[sort_idx[0]]) #椭圆宽ellipse_height = 2 * np.sqrt(chi2.ppf(0.95, 2)) * np.sqrt(eigenvals[sort_idx[1]]) #椭圆高angle = np.degrees(np.arctan2(*eigenvecs[:, sort_idx[0]][::-1])) #旋转角度#填充色face_rgba = mcolors.to_rgba(color, alpha=0.15)ax.add_patch(ellipse) #加到图上

第四部分

# =========================================================================================# ======================================4.PCoA子图绘制函数=======================================# =========================================================================================def draw_pcoa_subplot(ax, df, panel_letter, distance_method, var_pcoa1, var_pcoa2, r2_val, p_val, scheme_id):ax.axhline(y=0, #ycolor='gray', #颜色linestyle='--', #虚线linewidth=1.2, #粗细alpha=0.6, #透明度zorder=0) #层#垂直辅助线ax.axvline(x=0, #xcolor='gray', #颜色linestyle='--', #虚线linewidth=1.2,#粗细alpha=0.6, #透明度zorder=0) #层

第五部分

#遍历组for group in groups:#绘制散点ax.scatter(data['PCoA1'], #xdata['PCoA2'], #ycolor=colors[group], #颜色s=70, #大小alpha=0.9, #透明度edgecolors='white', #边缘线颜色linewidths=0.5, #边缘线粗细label=group, #图例标签zorder=3) #层

第六部分

#x轴标题ax.set_xlabel(f'PCoA1 ({var_pcoa1:.2f}%)', #文本fontsize=16, #大小fontweight='bold') #加粗#y轴标题ax.set_ylabel(f'PCoA2 ({var_pcoa2:.2f}%)',#文本fontsize=16, #大小fontweight='bold') #加粗#设置xy轴刻度ax.tick_params(axis='both', #轴which='major', #主刻度labelsize=16, #字体大小width=2, #粗细length=5, #长direction='out') #朝外#设置刻度字体粗细for label in ax.get_xticklabels() + ax.get_yticklabels():label.set_fontweight('bold')#设置边框粗细for spine in ax.spines.values():spine.set_linewidth(2)#添加子图标题ax.set_title(f"PCoA_{distance_method}" , #文本fontsize=16, #大小fontweight='bold', #加粗pad=12) #间距#添加子图编号ax.text(-0.15, #x1.02, #ypanel_letter, #编号transform=ax.transAxes, #坐标系fontsize=22, #字体大小fontweight='bold', #加粗va='bottom') #垂直对齐

第七部分

# =========================================================================================# ======================================5.主绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(df_real, scheme_id):#创建画布fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(14, 5.5))plt.subplots_adjust(wspace=0.2) #子图间距x_margin_jc = (df_jc['PCoA1'].max() - df_jc['PCoA1'].min()) * 0.35 #x轴间距y_margin_jc = (df_jc['PCoA2'].max() - df_jc['PCoA2'].min()) * 0.35 #y轴间距ax2.set_xlim(df_jc['PCoA1'].min() - x_margin_jc, df_jc['PCoA1'].max() + x_margin_jc) #x轴范围ax2.set_ylim(df_jc['PCoA2'].min() - y_margin_jc, df_jc['PCoA2'].max() + y_margin_jc) #y轴范围

第八部分

# =========================================================================================# ======================================6.执行部分=======================================# =========================================================================================if __name__ == '__main__':excel_path = r'data.xlsx' #原始数据df_abund = pd.read_excel(excel_path, sheet_name='Abundance', index_col=0) #丰度表df_group = pd.read_excel(excel_path, sheet_name='Metadata', index_col=0) #分组表df_abund.index = df_abund.index.astype(str) #格式化索引类型df_group.index = df_group.index.astype(str)#评估stats_bc = {'r2': calc_r2(perm_bc['test statistic'], df_group), 'p': perm_bc['p-value']}stats_jc = {'r2': calc_r2(perm_jc['test statistic'], df_group), 'p': perm_jc['p-value']}scheme_id = 1print('正在绘制并保存方案:', scheme_id)plot_advanced_forest_chart(df_real, scheme_id)

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:
excel_path = r'data.xlsx' #原始数据2.读取指定表的数据,执行部分:
df_abund = pd.read_excel(excel_path, sheet_name='Abundance', index_col=0) #丰度表df_group = pd.read_excel(excel_path, sheet_name='Metadata', index_col=0) #分组表
3.设置是否进行批量绘图,执行部分:
plot_all = True4.设置绘图结果的保存地址,主绘图函数部分:
plt.savefig(fr'PCoA_Result_Scheme_{scheme_id}.png', dpi=300,bbox_inches='tight')
推荐


获取方式
