
代码绘制成果展示







代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import osimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom matplotlib.colors import LinearSegmentedColormap

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#0000CD', '#FF0000', '#2E8B57', '#9400D3'],}

第三部分

# =========================================================================================# ======================================3.曲线拟合函数=======================================# =========================================================================================def fit_best_curve(x, y, x_smooth):models = {} # 用于存储模型n = len(x) # 数据点数量# 线性回归p1 = np.polyfit(x, y, 1)models['Linear'] = (np.poly1d(p1)(x), np.poly1d(p1)(x_smooth), 1)# 二次多项式p2 = np.polyfit(x, y, 2)models['Poly2'] = (np.poly1d(p2)(x), np.poly1d(p2)(x_smooth), 2)# 三次多项式p3 = np.polyfit(x, y, 3)models['Poly3'] = (np.poly1d(p3)(x), np.poly1d(p3)(x_smooth), 3)has_non_positive = np.min(x) <= 0 # 检查是否存在小于等于0的值best_r2 = -float('inf') # 初始化最高R2best_y_smooth = None # 初始化最佳平滑y值best_p_val = 1.0 # 初始化最佳P值y_mean = np.mean(y) # y的均值ss_tot = np.sum((y - y_mean) ** 2) + 1e-8 # 计算总平方和,加极小值防分母为零# 如果当前模型R2更好if r2 > best_r2:best_r2 = r2 # 更新最佳R2best_y_smooth = y_pred_smooth # 更新对应的预测曲线Y值best_p_val = p_val # 更新对应P值return best_y_smooth, best_r2, best_p_val # 返回平滑预测值、R2和P值

第四部分

# =========================================================================================# ======================================4.寻找曲线拐点函数=======================================# =========================================================================================def find_inflection_threshold(x, y):y_double_prime = np.gradient(y_prime) / (dx + 1e-8) # 计算二阶导数curvature = np.abs(y_double_prime) / (1 + y_prime ** 2) ** 1.5 # 计算曲率margin = int(len(x) * 0.1) # 忽略前后10%的数据以避免边界效应valid_curvature = curvature[margin:-margin] # 提取中间部分的曲率max_idx = margin + np.argmax(valid_curvature) # 寻找最大曲率位置对应原始数据的索引return max_idx # 返回拐点索引

第五部分

# =========================================================================================# ======================================6.散点图绘制函数=======================================# =========================================================================================def draw_scatter(ax, df, feature_col, xlabel_text, analysis_res, scheme_id):scatter_pt_c, scatter_line_c, _, _ = COLOR_SCHEMES[scheme_id] # 获取散点及拟合线颜色# 绘制散点r2 = analysis_res['r2'] # 获取分析结果中的R2p_val = analysis_res['p_value'] # P值# 设置显著性标记if p_val < 0.001:p_text = r'p < 0.001'elif p_val < 0.01:p_text = r'p < 0.01'elif p_val < 0.05:p_text = r'p < 0.05'else:p_text = f'p={p_val:.3f}'# 添加文本标注ax.text(0.65, # x0.88, # yf'$R^2={r2:.4f}$', # 文本fontsize=22, # 字体大小transform=ax.transAxes) # 坐标系ax.text(0.65, # x0.78, # yf'${p_text}$', # 文本fontsize=22, # 大小transform=ax.transAxes) # 坐标系apply_axis_styles(ax, df, feature_col, xlabel_text) # 设置轴和刻度

第六部分

# =========================================================================================# ======================================7.热图绘制函数=======================================# =========================================================================================def draw_heatmap(fig, ax, df, feature_col, xlabel_text, scheme_id):scatter_pt_c, scatter_line_c, _, _ = COLOR_SCHEMES[scheme_id] # 提取配色# 创建渐变色custom_cmap = LinearSegmentedColormap.from_list(f'cmap_{scheme_id}',['#101030', scatter_pt_c, '#f5f5f5', scatter_line_c])if len(x_data) > 10000:idx = np.random.choice(len(x_data), 10000, replace=False) # 无放回抽样x_sample = x_data[idx] # x轴抽样数据y_sample = y_data[idx] # y轴抽样数据else:x_sample = x_data # xy_sample = y_data # y# 绘制颜色条cbar = fig.colorbar(h, cax=cax, format='%.4f')# 颜色条顶部标题cbar.ax.set_title('Density', fontsize=16, pad=15)cbar.ax.tick_params(labelsize=14) # 颜色条刻度标注apply_axis_styles(ax, df, feature_col, xlabel_text) # 设置轴和刻度

第七部分

# =========================================================================================# ======================================8.RCS绘制函数======================================# =========================================================================================def draw_rcs(ax, df, feature_col, xlabel_text, analysis_res, scheme_id):_, _, rcs_fill_c, rcs_pt_c = COLOR_SCHEMES[scheme_id] # 提取配色x_smooth = analysis_res['x_smooth'] # 平滑xy_bottom = 0.0 # 曲线下面积的底部参考线im.set_clip_path(patch) # 把之前创建的曲线路径作为掩膜实现曲线下渐变填充# 绘制RCS主平滑线ax.plot(x_smooth, # xy_rcs, # ycolor='#2C2C2C', # 颜色linestyle='--', # 虚线linewidth=1.5) # 粗细x_min_data, x_max_data = df[feature_col].min(), df[feature_col].max() # 真实数据x极值x_pad = (x_max_data - x_min_data) * 0.05 # 两侧留白y_pad = (1.0 - 0.0) * 0.05 # y两侧六百# 文本ax.text(threshold_x, # xthreshold_y - 0.1, # yf'({threshold_x:.2f},' # 文本xf' {threshold_y:.4f})', # 文本yfontsize=16, # 大小ha='center', # 水平va='top') # 垂直apply_axis_styles(ax, df, feature_col, xlabel_text) # 设置轴和刻度

第八部分

# =========================================================================================# ======================================9.执行部分=======================================# =========================================================================================if __name__ == '__main__':all_analysis_results = {} # 存储各特征分析结果# 遍历特征for col, xlabel in feature_configs:num_bins = 100 # 分箱数x_data = df_real[col] # 取该特征数据bins = np.linspace(x_data.min(), x_data.max(), num_bins + 1) # 生成等间距的分箱区间bin_centers = [] # 存储分箱中点的列表boundary_y = [] # 存储边界Y值(98分位数)的列表# 遍历分箱for i in range(num_bins):mask = (x_data >= bins[i]) & (x_data < bins[i + 1]) # 生成当前分箱的数据掩码y_in_bin = df_real['LERI'][mask] # 提取落入当前分箱的目标值if len(y_in_bin) > 10:bin_centers.append(0.5 * (bins[i] + bins[i + 1])) # 计算当前分箱中心坐标boundary_y.append(np.percentile(y_in_bin, 98)) # 计算箱内数据的第98百分位数作为边界# 是否批量绘图plot_all = Trueschemes_to_run = list(COLOR_SCHEMES.keys()) if plot_all else [1] # 获取配色# 遍历配色进行绘图for scheme_id in schemes_to_run:print(f'正在绘制并保存方案:[{scheme_id}]')fig_combo.tight_layout(w_pad=0.0, h_pad=2) # 组图布局调整# 保存组图fig_combo.savefig(os.path.join(BASE_DIR, f'Combined_AllFeatures_scheme_{scheme_id}.png'), dpi=300,bbox_inches='tight')plt.close(fig_combo) # 关闭

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:
df_real = pd.read_excel(r'data.xlsx') 2.设置绘图结果的保存路径,执行部分:
BASE_DIR = r'分析' # 保存路径DIR_SCATTER = os.path.join(BASE_DIR, 'Scatter') # 散点图保存路径DIR_HEATMAP = os.path.join(BASE_DIR, 'Heatmap') # 热力图保存路径DIR_RCS = os.path.join(BASE_DIR, 'RCS') # RCS图保存路径
3.设置特征的单位,执行部分:
feature_configs = [ ('Elevation', 'Elevation/m'), ('Temperature', 'Temperature/°C'), ('Precipitation', 'Precipitation/mm'), ('WindSpeed', 'Wind speed(m/s)')]4.设置是否要进行批量绘图,执行部分:
plot_all = True
推荐


获取方式
