
代码绘制成果展示










代码解释


第一部分

# =========================================================================================# ====================================== 1. 库的导入 =========================================# =========================================================================================import matplotlib.pyplot as pltimport matplotlib.patches as patchesimport matplotlib.colors as mcolorsimport numpy as npimport pandas as pdimport osimport mathimport matplotlibmatplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42plt.rcParams['font.family'] = 'Times New Roman'plt.rcParams['axes.unicode_minus'] = False

第二部分

# =========================================================================================# ====================================== 2. 颜色库==========================# =========================================================================================COLOR_SCHEMES = {1: {'palette': ['#D32F2F', '#FF5722', '#FF9800', '#FDD835', '#CDDC39', '#4CAF50', '#009688', '#1976D2', '#673AB7', '#E91E63', '#795548', '#607D8B'],'cmap_colors': ["#F8BBD0", "#FFF176", "#66BB6A", "#1B5E20"]},}SELECTED_SCHEME= 2 # 选择配色方案CURRENT_SCHEME = COLOR_SCHEMES.get(SELECTED_SCHEME, COLOR_SCHEMES[1]) #获取当前选择的配色方案PALETTE = CURRENT_SCHEME['palette'] #单因子颜色CMAP_COLORS = CURRENT_SCHEME['cmap_colors'] #交互作用热力图渐变色

第三部分

# =========================================================================================# ====================================== 3. 绘图函数 =========================================# =========================================================================================def draw_geodetector_chart(wheat_matrix,#左上角热图数据maize_matrix,#右下角数据wheat_single,#内圈数据maize_single,#外圈数据labels,#特征save_dir):#保存路径custom_cmap = mcolors.LinearSegmentedColormap.from_list(f"custom_scheme_{SELECTED_SCHEME}", CMAP_COLORS, N=256)# vmin = min(np.nanmin(wheat_matrix), np.nanmin(maize_matrix))# vmax = max(np.nanmax(wheat_matrix), np.nanmax(maize_matrix))norm = mcolors.Normalize(vmin=0, vmax=1) #创建颜色归一化对象# 创建画布fig = plt.figure(figsize=(16, 10), facecolor='white')

第四部分

# ------------------------------------------------------------------#左上角热图# -------------------------------------------------------------------# 在画布上添加一个新的坐标轴用于绘制交互作用热图,[左, 下, 宽, 高]ax_wheat = fig.add_axes([0.15, 0.45, 0.35, 0.5])ax_wheat.set_aspect('equal') #设置坐标轴的纵横比为相等ax_wheat.axis('off') #不显示边框和刻度ax_wheat.set_xlim(0, n_factors) # x 轴范围ax_wheat.set_ylim(0, n_factors) #y 轴范围for y in range(n_factors): # 遍历行for x in range(n_factors): # 遍历列if y >= x:val = wheat_matrix[y, x] #获取对应位置的值if pd.isna(val): continue # 如果值为空,跳过color = custom_cmap(norm(val)) #根据数值获取对应的颜色# 创建一个矩形块rect = patches.Rectangle((x + 0.02, y + 0.02), #坐标0.96, #宽度0.96, #高度linewidth=0, #边框线宽facecolor=color) #填充颜色ax_wheat.add_patch(rect) #将矩形块添加到坐标轴中for y in range(n_factors): # 遍历 y 轴方向的因子# 在左侧添加行标签ax_wheat.text(-0.2, #x 坐标y + 0.5,#y 坐标labels[y],#文本内容ha='right',#水平对齐va='center', #垂直对齐fontsize=12)#字体大小#子标题位置ax_wheat.text(n_factors * 0.8, #x 坐标n_factors * 0.7, #y 坐标"Wheat", #文本内容fontsize=20, #字体大小为bbox=dict( # 文本边框的样式facecolor='white', #填充背景色edgecolor='gray', #边框线的颜色pad=6 #内边距))

第五部分
# -------------------------------------------------------------------# 右下角热图# -------------------------------------------------------------------# 添加坐标轴,[左, 下, 宽, 高]ax_maize = fig.add_axes([0.45, 0.05, 0.35, 0.5])ax_maize.set_aspect('equal') #设置纵横比ax_maize.axis('off') #关闭坐标轴ax_maize.set_xlim(0, n_factors) #x轴范围ax_maize.set_ylim(0, n_factors) #y轴范围for y in range(n_factors): # 遍历行for x in range(n_factors): # 遍历列if x >= y:val = maize_matrix[y, x] #获取对应位置的值if pd.isna(val): continue # 如果值为空,跳过color = custom_cmap(norm(val)) #获取颜色# 创建矩形块rect = patches.Rectangle((x + 0.02, y + 0.02),#坐标0.96,#宽0.96,#高linewidth=0,#边框线粗细facecolor=color)#颜色ax_maize.add_patch(rect) #添加矩形块# 添加子图标题 (Maize)ax_maize.text(n_factors * 0.6, # x 坐标n_factors * 0.8, #y 坐标"Maize", #文本内容fontsize=20, # 字体大小bbox=dict( # 设置文本背景框facecolor='white', #背景框填充色edgecolor='gray', #边框线颜色pad=6 # 内边距))# 添加主标题ax_maize.text(n_factors * 0.5, #x 坐标n_factors * 1.3, #y 坐标"Double Factors\nInteraction", #内容fontsize=24, #大小color='#5C6BC0', #字体颜色ha='center', #水平对齐方式fontweight='bold') #字体粗细

第六部分

# -------------------------------------------------------------------# 中间圆环图# -------------------------------------------------------------------# 添加中间圆环图的坐标轴ax_pie = fig.add_axes([0.33, #左0.35, # 下边界0.3, #占画布总宽度0.3]) # 占画布总高度ax_pie.set_aspect('equal') # 设置纵横比ax_pie.set_xlim(-1.7, 1.7) # x 轴范围ax_pie.set_ylim(-1.7, 1.7) # y 轴范围ax_pie.axis('off') #关闭坐标# =========================================================================================# 绘制外层圆环# =========================================================================================wedges_out, _ = ax_pie.pie(maize_single, # 输入数据radius=r_outer, # 半径colors=color_list, # 颜色startangle=90, # 起始角度counterclock=False, #顺时针绘制wedgeprops=dict(width=w_outer, #环的宽度edgecolor='white', #扇形之间的分割线颜色linewidth=1.5 #分割线的宽度))# =========================================================================================# 绘制内层圆环# =========================================================================================wedges_in, _ = ax_pie.pie(wheat_single, # 输入数据radius=r_inner, #半径colors=color_list, #颜色startangle=90, # 起始角度counterclock=False, #方向wedgeprops=dict(width=w_inner, #内环的宽度edgecolor='white', # 分割线颜色linewidth=1.5 #分割线宽度))

第七部分

# =========================================================================================# 绘制装饰性虚线圆# =========================================================================================# 创建外层虚线圆circle_dash_out = patches.Circle((0, 0), # 圆心坐标r_outer + 0.15, #半径transform=ax_pie.transData, #坐标系转换fill=False, # 不填充颜色edgecolor='black', #边框颜色linestyle='-.', #点划线linewidth=1, #线条粗细clip_on=False) #允许图形超出坐标轴边界显示ax_pie.add_patch(circle_dash_out) # 将创建好的外层虚线圆添加到坐标轴上# =========================================================================================# 添加圆环标签文字# =========================================================================================# 外环标签ax_pie.text(0, r_outer + 0.15, #文本坐标"maize", # 文本内容ha='center', # 水平居中对齐va='center', # 垂直居中对齐fontsize=12, # 字体大小backgroundcolor='white', # 设置背景色fontweight='bold') # 字体加粗

第八部分

# =========================================================================================#图例# =========================================================================================# 添加图例区域的坐标轴ax_legend = fig.add_axes([0.15,0.1,0.25,0.25])legend_cols = 3 #图例列数legend_rows = math.ceil(n_factors / legend_cols) #行数ax_legend.set_xlim(0, legend_cols) # x 范围ax_legend.set_ylim(0, legend_rows) # y 范围ax_legend.axis('off') #关闭坐标轴显示#遍历所有因子生成图例for idx, label in enumerate(labels):row_idx = legend_rows - 1 - (idx // legend_cols) # 行索引col_idx = idx % legend_cols # 列索引color = factor_colors[label] #当前因子的颜色

第九部分

# =========================================================================================#颜色条# =========================================================================================# 添加颜色条的坐标轴,位置在最右侧ax_cbar = fig.add_axes([0.85,0.15,0.02,0.6])# 创建垂直颜色条cb = matplotlib.colorbar.ColorbarBase(ax_cbar,cmap=custom_cmap,norm=norm,orientation='vertical')cb.ax.tick_params(labelsize=12) #设置刻度标签字体大小# 保存png_path = os.path.join(save_dir, f"Scheme_{SELECTED_SCHEME}.png")pdf_path = os.path.join(save_dir, f"Scheme_{SELECTED_SCHEME}.pdf")plt.savefig(png_path, dpi=300, bbox_inches='tight')plt.savefig(pdf_path, bbox_inches='tight')

第十部分

# =========================================================================================# ====================================== 4. 主程序执行 ========================================# =========================================================================================if __name__ == "__main__":base_dir = r"组合图" #保存路径#读取数据df_wheat_mat = pd.read_excel(r"组合图\geodetector_data.xlsx" , sheet_name='Wheat_Interaction_Matrix', index_col=0)df_maize_mat = pd.read_excel(r"组合图\geodetector_data.xlsx" , sheet_name='Maize_Interaction_Matrix', index_col=0)df_single = pd.read_excel(r"组合图\geodetector_data.xlsx" , sheet_name='Single_Factor_q', index_col=0)#提取特征名称dynamic_labels = df_wheat_mat.index.tolist()print(f"检测到的因子 ({len(dynamic_labels)}个): {dynamic_labels}")wheat_matrix_val = df_wheat_mat.values #转换为 numpy 数组maize_matrix_val = df_maize_mat.values #转换为 numpy 数组wheat_single_list = df_single['Wheat_Single_q'].tolist() #转换为列表maize_single_list = df_single['Maize_Single_q'].tolist() #转换为列表#调用绘图函数draw_geodetector_chart(wheat_matrix_val, #交互矩阵数据maize_matrix_val, # 交互矩阵数据wheat_single_list, #单因子maize_single_list, #单因子dynamic_labels, #标签列表base_dir #保存路径)

如何应用到你自己的数据

1.设置颜色方案:
SELECTED_SCHEME= 40 # 选择配色方案2.设置绘图结果的保存路径:
base_dir = r"组合图" #保存路径3.读取数据:
#读取数据df_wheat_mat = pd.read_excel(r"detector_data.xlsx" , sheet_name='Wheat_Interaction_Matrix', index_col=0)

推荐


获取方式
