如何修改Python代码在Taylor Diagram中显示负相关?
泰勒图适配负相关的修改方案
核心原理调整
泰勒图中相关系数r与极角θ的映射关系为 r = cos(θ),原代码通常仅处理r≥0的场景(对应θ∈[0, π/2])。要支持负相关,只需将r<0的情况映射到θ∈[π/2, π]——arccos(r)本身就能覆盖r∈[-1,1]的全范围:当r=-1时,θ=π(对应极坐标左端点);r=0时,θ=π/2(上端点);r=1时,θ=0(右端点)。
具体代码修改
原代码常见问题点
无法显示负相关的典型原因:
- 主动过滤了
r<0的样本,直接丢弃负相关数据 - 角度计算时强制将负
r转为正值,导致负相关点被错误映射到正相关区域 - 极坐标角度范围被限制在
[0, π/2],未开放到[0, π]
修改后的完整可运行代码
import numpy as np import matplotlib.pyplot as plt def taylor_diagram(ref, models, model_names=None, figsize=(8,8)): # 计算参考序列标准差 ref_std = np.std(ref) # 批量计算模型的标准差、相关系数 model_stats = [] for mod in models: mod_std = np.std(mod) corr = np.corrcoef(ref, mod)[0,1] model_stats.append((mod_std, corr)) # 初始化极坐标画布 fig = plt.figure(figsize=figsize) ax = fig.add_subplot(111, polar=True) # 适配泰勒图惯例:极角顺时针递增,r=1对应正右方 ax.set_theta_direction(-1) ax.set_theta_offset(np.pi/2) # 开放角度范围到180度,支持负相关映射 ax.set_thetamin(0) ax.set_thetamax(180) # 绘制参考点(自身相关系数为1,对应0度) ax.plot(0, ref_std, 'ko', markersize=10, label='Reference') # 绘制标准差同心圆刻度 max_std = max(ref_std, max(s for s, r in model_stats)) * 1.1 std_levels = np.linspace(0, max_std, 5) for std in std_levels: ax.plot(np.linspace(0, np.pi, 100), np.full(100, std), 'k--', alpha=0.5) # 绘制包含负相关的径向刻度线 corr_levels = np.array([-1, -0.75, -0.5, 0, 0.5, 0.75, 1]) for corr in corr_levels: theta = np.arccos(corr) ax.plot([theta, theta], [0, max_std], 'k:', alpha=0.5) # 绘制所有模型点(含负相关) colors = plt.cm.viridis(np.linspace(0,1,len(models))) for i, (std, corr) in enumerate(model_stats): theta = np.arccos(corr) # 直接用arccos处理正负相关 ax.plot(theta, std, 'o', color=colors[i], markersize=8, label=model_names[i] if model_names else f'Model {i+1}') # 配置坐标轴与图例 ax.set_ylim(0, max_std) ax.set_ylabel('Standard Deviation', labelpad=20) ax.set_xticks(np.arccos(corr_levels)) ax.set_xticklabels([f'{c:.2f}' for c in corr_levels]) plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1)) plt.title('Taylor Diagram with Negative Correlation Support') plt.show() # 测试数据集:涵盖正相关、负相关、弱相关模型 np.random.seed(42) ref_data = np.random.normal(0, 2, 100) pos_corr_model = ref_data * 0.8 + np.random.normal(0, 0.5, 100) # 正相关 neg_corr_model = -ref_data * 0.6 + np.random.normal(0, 0.7, 100) # 负相关 weak_corr_model = np.random.normal(0, 1.5, 100) # 弱相关 # 生成带负相关支持的泰勒图 taylor_diagram(ref_data, [pos_corr_model, neg_corr_model, weak_corr_model], model_names=['Positive Corr', 'Negative Corr', 'Weak Corr'])
关键修改说明
- 极坐标范围开放:通过
set_thetamax(180)允许角度覆盖0~π,对应相关系数1~-1 - 角度计算逻辑:直接使用
theta = np.arccos(corr),无需额外处理正负值,函数原生支持全范围相关系数映射 - 刻度标签补充:添加负相关刻度(-1、-0.75等),让负相关区域的含义直观清晰
- 数据全量保留:不对负相关系数做截断或过滤,确保所有模型数据都能正确展示
测试效果
运行代码后可观察到:
- 正相关模型点位于极坐标右半区域(靠近0度刻度)
- 负相关模型点位于极坐标左半区域(靠近180度刻度)
- 弱相关模型点靠近90度刻度位置
内容的提问来源于stack exchange,提问作者William Jacondino
相关产品推荐
相关产品推荐

