You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:25:19