Python高逼格泰勒图及源码~,多模型对比~可视化工具

在数据科学和气象、海洋等诸多领域,我们常常需要对比多个模型的表现。泰勒图(Taylor Diagram)就是一个能直观展示不同模型统计特性关系的强大工具,今天咱就用 Python 搞出高逼格的泰勒图,实现多模型对比可视化。

什么是泰勒图

泰勒图以一种简洁的方式将多个数据集的标准差、相关性以及与参考数据集的 RMS(均方根误差)展示在一个极坐标图中。它能让我们快速了解不同模型与参考数据的接近程度,以及各个模型之间的差异。

Python 实现泰勒图

要绘制泰勒图,我们主要会用到 matplotlib 库。下面咱就一步步实现它。

准备数据

首先,假设我们有几个模型的预测数据以及一组真实数据作为参考。以简单的正弦函数模拟为例:

import numpy as np

# 生成参考数据
x = np.linspace(0, 2 * np.pi, 100)
true_data = np.sin(x)

# 模拟三个不同模型的数据
model1 = np.sin(x) + np.random.normal(0, 0.1, len(x))
model2 = np.sin(x + 0.1) + np.random.normal(0, 0.2, len(x))
model3 = np.sin(x - 0.1) + np.random.normal(0, 0.3, len(x))

在这段代码里,我们先用 np.linspace 生成了在 02 * np.pi 之间均匀分布的 100 个点作为自变量 x。然后用 np.sin(x) 生成了真实数据 true_data。接着通过给正弦函数加上不同程度的噪声模拟了三个不同模型的数据 model1model2model3

计算统计量

为了绘制泰勒图,我们需要计算每个模型数据与参考数据的标准差、相关性以及 RMS。

def compute_stats(data, ref_data):
    std_dev = np.std(data)
    corr_coeff = np.corrcoef(data, ref_data)[0, 1]
    rms = np.sqrt(np.mean((data - ref_data) ** 2))
    return std_dev, corr_coeff, rms


stats_model1 = compute_stats(model1, true_data)
stats_model2 = compute_stats(model2, true_data)
stats_model3 = compute_stats(model3, true_data)

这里定义了一个 computestats 函数,它接收模型数据和参考数据作为参数。通过 np.std 计算标准差,np.corrcoef 计算相关性系数,np.sqrt(np.mean((data - refdata) 2)) 计算均方根误差。然后分别对三个模型调用这个函数得到各自的统计量。

绘制泰勒图

下面就是重头戏,绘制泰勒图啦!

import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator


def taylor_diagram(stats_list, labels):
    fig, ax = plt.subplots(subplot_kw={"projection": "polar"})

    # 绘制参考圆
    ax.plot([0, np.pi / 2], [1, 1], 'k--', lw=1)
    ax.plot([0, np.pi], [np.sqrt(2), np.sqrt(2)], 'k--', lw=1)
    ax.plot([0, 3 * np.pi / 2], [np.sqrt(3), np.sqrt(3)], 'k--', lw=1)

    # 绘制参考线
    angles = np.linspace(0, np.pi / 2, 100)
    for rho in [0.2, 0.4, 0.6, 0.8]:
        r = 1 / rho
        ax.plot(angles, r * np.cos(angles), 'k--', lw=1)

    for i, (std_dev, corr_coeff, rms) in enumerate(stats_list):
        angle = np.arccos(corr_coeff)
        radius = std_dev
        ax.plot(angle, radius, 'o-', label=labels[i])

    ax.set_theta_zero_location('N')
    ax.set_theta_direction(-1)
    ax.set_rlabel_position(135)
    ax.yaxis.set_major_locator(MultipleLocator(0.5))
    ax.set_title('Taylor Diagram for Model Comparison')
    ax.legend()
    plt.show()


labels = ['Model 1', 'Model 2', 'Model 3']
taylor_diagram([stats_model1, stats_model2, stats_model3], labels)

这段代码首先创建了一个极坐标子图。通过 ax.plot 绘制了不同标准差的参考圆,以及不同相关系数的参考线。然后遍历每个模型的统计量,根据相关性系数计算角度,标准差作为半径,在图上绘制每个模型对应的点,并连线标注。最后对图形进行一些设置,如设置极坐标的方向、标签位置等,加上标题和图例并展示图形。

总结

通过上面的代码,我们成功用 Python 绘制出了高逼格的泰勒图,实现了多模型对比可视化。泰勒图能帮助我们从整体上把握不同模型的特性和差异,在模型评估和选择时提供有力的可视化支持。大家可以根据实际需求,替换真实的数据,来分析自己的模型啦!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐