
代码绘制成果展示









代码解释


第一部分

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom matplotlib.patches import FancyBboxPatchfrom matplotlib.colors import LinearSegmentedColormap, Normalizefrom scipy.stats import pearsonr, spearmanrfrom scipy.spatial.distance import pdist, squareform

第二部分

COLOR_SCHEMES = {1: {'pearson': ["#35978f", "#f5f5f5", "#bf812d"],'mantel': ["#c7eae5", "#80cdc1", "#35978f"]}}SCHEME_ID = 60 # 选择使用的配色方案colors = COLOR_SCHEMES.get(SCHEME_ID, COLOR_SCHEMES[1]) #获取颜色方案cmap_pearson = LinearSegmentedColormap.from_list("p", colors.get('pearson'), N=100) #相关性颜色cmap_mantel = LinearSegmentedColormap.from_list("m", colors.get('mantel'), N=100) #Mantel检验颜色

第三部分

def perform_pearson_analysis(env_df, bio_df):common_index = env_df.index.intersection(bio_df.index) # 获取索引,样本匹配#筛选数据env = env_df.loc[common_index]bio = bio_df.loc[common_index]r_matrix = pd.DataFrame(index=bio.columns, columns=env.columns, dtype=float) # 初始化相关系数值矩阵p_matrix = pd.DataFrame(index=bio.columns, columns=env.columns, dtype=float) # 初始化p值矩阵for row_var in bio.columns: # 遍历x的每一列for col_var in env.columns: # 遍历y的每一列r, p = pearsonr(bio[row_var], env[col_var]) #相关性性分析r_matrix.loc[row_var, col_var] = r #r值p_matrix.loc[row_var, col_var] = p #p值return r_matrix, p_matrix

第四部分

def perform_mantel_analysis(env_df, bio_df):env_vars = env_df.columns # x轴标签bio_vars = bio_df.columns # y轴标签# 初始化结果矩阵mantel_r = pd.DataFrame(index=bio_vars, columns=env_vars, dtype=float)mantel_p = pd.DataFrame(index=bio_vars, columns=env_vars, dtype=float)# 遍历x,yfor bio_name in bio_vars:for env_name in env_vars:# 提取数据var_bio_col = bio_df[[bio_name]].valuesvar_env_col = env_df[[env_name]].values# 计算距离矩阵dist_matrix_bio = squareform(pdist(var_bio_col, metric='euclidean'))dist_matrix_env = squareform(pdist(var_env_col, metric='euclidean'))#分析r, p, _ = mantel(dist_matrix_bio, dist_matrix_env, method='pearson', permutations=999)#保存结果mantel_r.loc[bio_name, env_name] = rmantel_p.loc[bio_name, env_name] = preturn mantel_r, mantel_p

第五部分

def plot_heatmap_square(ax, r_data, p_data, cmap, vmin, vmax, title):rows, cols = r_data.shape # 获取数据的行数和列数ax.set_xlim(0, cols) #X轴范围ax.set_ylim(0, rows) #Y轴范围ax.invert_yaxis() #反转Y轴norm = Normalize(vmin=vmin, vmax=vmax) # 创建颜色归一化对象for i in range(rows): #遍历行for j in range(cols): #遍历列val = r_data.iloc[i, j] #获取对应的r值p_val = p_data.iloc[i, j] #获取对应的p值color = cmap(norm(val)) #根据r值获取颜色if p_val < 0.01: # 如果p值小于0.01#添加文本ax.text(j + 0.5, #xi + 0.5,#y"**", #文本内容ha='center', #水平居中va='center', #垂直居中color='black') #字体颜色elif p_val < 0.05:ax.text(j + 0.5,#xi + 0.5,#y"*", # 文本内容ha='center',#水平居中va='center',#垂直居中color='black')#字体颜色ax.set_xticks(np.arange(cols) + 0.5) #X轴刻度位置#Y轴标签ax.set_yticklabels(r_data.index, rotation=0)ax.tick_params(length=0) #设置刻度线for spine in ax.spines.values(): # 遍历所有边框spine.set_visible(False) #隐藏边框# 设置标题ax.set_title(title, # 内容loc='left', #靠左fontsize=14, #字体大小fontweight='bold', #加粗pad=10) #边距

第六部分

def main_plot(results_dict, output_prefix):# 创建画布fig, axes = plt.subplots(2, 2, figsize=(16, 10))plt.subplots_adjust(wspace=0.05, hspace=-0.3, right=0.9) #调整子图间距plot_heatmap_square(axes[0, 1], results_dict['B_r'],results_dict['B_p'],cmap_pearson,-1,1,"B Nujiang River (Pearson)")plot_heatmap_square(axes[1, 0], results_dict['C_r'], results_dict['C_p'],cmap_mantel,0,0.5,"C Yellow River (Mantel)")plot_heatmap_square(axes[1, 1], results_dict['D_r'],results_dict['D_p'],cmap_mantel, 0,0.5,"D Nujiang River (Mantel)")# 隐藏Y轴刻度,标签axes[0, 1].set_yticks([])axes[0, 1].set_yticklabels([])axes[1, 1].set_yticks([])axes[1, 1].set_yticklabels([])# 隐藏x轴刻度,标签axes[0, 0].set_xticks([])axes[0, 0].set_xticklabels([])axes[0, 1].set_xticks([])axes[0, 1].set_xticklabels([])# 第一个颜色条的轴位置cbar_ax1 = fig.add_axes([0.92,#左0.55,#下0.012,#宽0.21])#高cb1 = plt.colorbar(plt.cm.ScalarMappable(norm=Normalize(-1, 1), cmap=cmap_pearson), cax=cbar_ax1) # 绘制颜色条cb1.set_label("Pearson's r", rotation=270, labelpad=15) #颜色条标题cb1.outline.set_visible(False) # 隐藏边cbar_ax2 = fig.add_axes([0.92, 0.23, 0.012, 0.21]) #第二个颜色条的轴位置cb2 = plt.colorbar(plt.cm.ScalarMappable(norm=Normalize(0, 0.5), cmap=cmap_mantel), cax=cbar_ax2) #绘制颜色条cb2.set_label("Mantel's r", rotation=270, labelpad=15) #颜色条标题

第七部分

if __name__ == "__main__":file_path = r"data.xlsx" #数据路径# 读取数据yr_env = pd.read_excel(file_path, sheet_name="YR_Env", index_col=0)# 执行皮尔逊分析r_a, p_a = perform_pearson_analysis(yr_env, yr_bio)r_b, p_b = perform_pearson_analysis(nj_env, nj_bio)# 执行Mantel分析r_c, p_c = perform_mantel_analysis(yr_env, yr_bio)r_d, p_d = perform_mantel_analysis(nj_env, nj_bio)main_plot(results, draw_path) # 调用主绘图函数

如何应用到你自己的数据

1.设置要使用的配色方案:
SCHEME_ID = 12.设置绘图结果的保存路径:
plt.savefig(fr"{SCHEME_ID}.png", dpi=300, bbox_inches='tight')plt.savefig(fr"{SCHEME_ID}.pdf", bbox_inches='tight')
3.设置原始数据的保存路径:
file_path = r"data.xlsx" #数据路径4.读取数据:
yr_env = pd.read_excel(file_path, sheet_name="YR_Env", index_col=0)
推荐


获取方式
