
代码绘制成果展示










代码解释


第一部分

import matplotlib.pyplot as pltimport numpy as npimport pandas as pdimport statsmodels.api as smfrom matplotlib.lines import Line2Dimport matplotlibplt.rcParams['font.family'] = 'serif'plt.rcParams['font.serif'] = ['Times New Roman']plt.rcParams['axes.unicode_minus'] = Falseplt.rcParams['mathtext.fontset'] = 'stix'

第二部分

COLOR_SCHEMES = {1: {'Climate': '#2E8B57', 'Anthro': '#2c3e50', 'Topo': '#E35F62'},}SCHEME_ID = 2 #使用的颜色方案current_colors = COLOR_SCHEMES.get(SCHEME_ID, COLOR_SCHEMES[1]) #提取颜色#不同类型指标的颜色COLOR_CLIMATE = current_colors['Climate']COLOR_ANTHRO = current_colors['Anthro']COLOR_TOPO = current_colors['Topo']

第三部分

def perform_regression_from_excel(file_path):excel_file = pd.ExcelFile(file_path) # 加载 Excel 文件对象indices = excel_file.sheet_names # 获取所有工作表的名称# 定义驱动因子在图表中的排列顺序drivers_ordered = ['Evaporation', 'CAPE', 'Relative humidity', 'Eastward wind', 'AOD', 'Area trend', 'Elevation'][::-1]analysis_results = {} # 初始化用于存储回归分析结果的字典scaler = StandardScaler() # 初始化标准化器# 循环处理每一个不同区域for idx in indices:df_raw = pd.read_excel(file_path, sheet_name=idx) # 读取数据# 对所有数据进行标准化(Z-score),使不同量纲的系数具有可比性df_scaled = pd.DataFrame(scaler.fit_transform(df_raw), columns=df_raw.columns)y = df_scaled['TARGET_VALUE'] #目标X = df_scaled.drop(columns=['TARGET_VALUE']) #自变量# 整理结果for driver in drivers_ordered:c = coefs[driver] if driver in coefs else 0 # 如果变量存在则取系数,否则记为0p = pvalues[driver] if driver in pvalues else 1 # 如果变量存在则取P值,否则记为1plot_data.append({'driver': driver, #名称'coef': c, # 回归系数'p_value': p, #显著性检验 P 值'significant': p < 0.05 # 判断并记录该因子是否显著(P < 0.05)})analysis_results[idx] = pd.DataFrame(plot_data) # 将结果转为 DataFrame 并存入总字典return analysis_results, drivers_ordered # 返回所有回归分析结果和排序后的标签

第四部分

def plot_figure_9(analysis_results, driver_labels):# 创建 2 行 4 列的画布fig, axes = plt.subplots(2, 4, figsize=(16, 8))axes = axes.flatten() # 将多维子图数组展平为一维方便循环处理# 定义各驱动因子所属的分类及对应的颜色group_colors = {'Evaporation': COLOR_CLIMATE,'CAPE': COLOR_CLIMATE,'Relative humidity': COLOR_CLIMATE,'Eastward wind': COLOR_CLIMATE,'AOD': COLOR_ANTHRO,'Area trend': COLOR_ANTHRO,'Elevation': COLOR_TOPO}indices = list(analysis_results.keys()) # 获取所有需要绘图的工作表键名

第五部分

for i, ax in enumerate(axes): # 遍历每一个子图坐标轴if i >= len(indices): # 如果子图位置超出了数据量ax.axis('off') # 隐藏多余的子图坐标轴continuekey = indices[i] # 获取当前子图对应的指标名称df = analysis_results[key] # 获取对应的回归分析结果数据ax.axhspan(0.55, #y轴起始2.45, #y轴终止xmin=-0.73, # x 轴方向的起始比例xmax=0, # x 轴方向的结束比例color=COLOR_ANTHRO, # 颜色填充alpha=0.35, # 透明度transform=ax.get_yaxis_transform(), #坐标系zorder=0,clip_on=False) # 允许在绘图框外显示色块ax.axhspan(-0.45, #y轴起始0.45, #y轴终止xmin=-0.73, # x 轴方向的起始比例xmax=0, # x 轴方向的结束比例color=COLOR_TOPO, # 颜色填充alpha=0.35, # 透明度transform=ax.get_yaxis_transform(), #坐标系zorder=0,clip_on=False) # 允许在绘图框外显示色块

第六部分

# 遍历当前子图数据中的每一行驱动因子for idx, row in df.iterrows():driver = row['driver'] # 获取驱动因子名称val = row['coef'] # 获取系数大小is_sig = row['significant'] # 获取显著性状态color = group_colors[driver] # 获取该因子对应的颜色y_pos = driver_labels.index(driver) # 确定在 Y 轴上的显示位置# 如果显著则填充白色,不显著则填充实心颜色face_c = 'white' if is_sig else color# 绘制回归系数的数值点ax.plot(val, # 在xy_pos, #ymarker='o', # 点的形状markersize=8, # 大小markerfacecolor=face_c, # 内部填充颜色markeredgecolor=color, #外边框颜色markeredgewidth=2, # 边框的粗细zorder=3)

第七部分

# 设置 Y 轴刻度位置ax.set_yticks(range(len(driver_labels)))# 如果是第一列子图if i % 4 == 0:#y轴名称标签ax.set_yticklabels(driver_labels,fontweight='bold',fontsize=15)#Y轴标签与轴线的间距ax.tick_params(axis='y',pad=15)# 隐藏所有的坐标轴刻度线ax.tick_params(axis='both',which='both',length=0,labelsize=16)[label.set_fontweight('bold') for label in ax.get_xticklabels()] # 遍历并设置 x 轴数值标注为加粗[label.set_fontweight('bold') for label in ax.get_yticklabels()] # 遍历并设置 y 轴数值标注为加粗#子图的标题ax.set_title(key, #内容loc='left', #位置fontweight='bold', #加粗fontsize=16, #大小pad=10) #间距#X轴固定范围ax.set_xlim(-1, 1)ax.xaxis.set_major_locator(ticker.MultipleLocator(0.5)) # 设置主刻度间隔# X轴的垂直网格参考线ax.grid(axis='x', #x 轴linestyle=':', #网格线的样式alpha=0.3) # 透明度

第八部分

#x轴标题fig.text(0.5, #x0.16, #y'Standardized Coefficient', #文本ha='center', #水平对齐va='center', #垂直对齐fontweight='bold', #粗细fontsize=16) #字体大小#创建图例legend_elements = [Line2D([0], #x[0], #ymarker='o', #标记形状color='w', #颜色label='Topography', #文本markerfacecolor=COLOR_TOPO, #点的填充颜色markersize=10), #圆点的大小Line2D([0], [0], marker='o', color='w', label='Anthropogenic', markerfacecolor=COLOR_ANTHRO, markersize=10),Line2D([0], [0], marker='o', color='w', label='Climate', markerfacecolor=COLOR_CLIMATE, markersize=10),plt.subplots_adjust(wspace=0.15, #子图之间的横向间距hspace=0.3, #纵向间距bottom=0.22, #底部left=0.18) #左侧边缘

第九部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================if __name__ == "__main__":input_excel = r'data.xlsx' #输入数据# 执行回归计算并获取结果results, labels = perform_regression_from_excel(input_excel)# 调用绘图函数plot_figure_9(results, labels)

如何应用到你自己的数据

1.设置颜色方案:
SCHEME_ID = 2 #使用的颜色方案2.提取驱动因子:
drivers_ordered = ['Evaporation', 'CAPE', 'Relative humidity', 'Eastward wind', 'AOD', 'Area trend', 'Elevation'][::-1] 3.提取目标:
y = df_scaled['TARGET_VALUE'] #目标4.划分变量的类别:
group_colors = { 'Evaporation': COLOR_CLIMATE, 'CAPE': COLOR_CLIMATE, 'Relative humidity': COLOR_CLIMATE, 'Eastward wind': COLOR_CLIMATE, 'AOD': COLOR_ANTHRO, 'Area trend': COLOR_ANTHRO, 'Elevation': COLOR_TOPO}5.设置绘图结果的保存路径:
plt.savefig(fr'theme_{SCHEME_ID}.png', dpi=300,bbox_inches='tight')plt.savefig(fr'theme_{SCHEME_ID}.pdf',bbox_inches='tight')
6.设置原始数据的路径:
input_excel = r'data.xlsx' #输入数据7.设置分析数据的路径:
output_excel_path = r'regression_summary.xlsx'
推荐


获取方式
