Python 使用手动显式标高覆盖tricontourf和散点图

Python 使用手动显式标高覆盖tricontourf和散点图,python,matplotlib,colormap,levels,contourf,Python,Matplotlib,Colormap,Levels,Contourf,我正在尝试将散点图(显示观察结果)覆盖到填充轮廓图(显示相同变量的模型数据)上,使用完全相同的级别映射到che colorscale。主要问题是,我没有使用“通用”的contour/contourf函数,而是使用tricontourf,因为我的数据位于非结构化网格上 看起来一些通常使用tourf的方法被tricontourf忽略了,而且这不是我第一次必须找到解决办法,因为实际使用tricontourf的选项没有很好的文档记录(例如,如何使用缺少的值进行绘图) 我想绘制累积降水量图。我有来自站点的

我正在尝试将散点图(显示观察结果)覆盖到填充轮廓图(显示相同变量的模型数据)上,使用完全相同的级别映射到che colorscale。主要问题是,我没有使用“通用”的
contour
/
contourf
函数,而是使用
tricontourf
,因为我的数据位于非结构化网格上

看起来一些通常使用
tourf
的方法被
tricontourf
忽略了,而且这不是我第一次必须找到解决办法,因为实际使用
tricontourf
的选项没有很好的文档记录(例如,如何使用缺少的值进行绘图)

我想绘制累积降水量图。我有来自站点的准时数据和来自模型的网格数据。两者都是由一维纬度和经度数组描述的一维数组。我需要为两个图选择相同的级别,因为我想覆盖它们并查看差异。我正在使用
pyplot.scatter
绘制点,并使用
pyplot.tricontourf
绘制模型数据。以下是我使用的方法:

  • pyplot.scatter
    pyplot.tricontourf
    定义
    vmin
    pyplot.tricontourf
    ,使用相同的cmap,以便它们以相同的级别映射->不起
    pyplot的作用。tricontourf
    显然忽略了
    vmin
    vmax
    。遵循这个例子对我不起作用。它们将被忽略,并且级别将自动定义
  • 由于在
    pyplot.tricontourf
    中指定级别的唯一方法是使用
    levels
    参数,因此我通过定义一个值数组来实现。这适用于
    tricontourf
    ,但我必须为散点图绘制它

    levels=[10, 12, 15, 20, 25, 30, 35, 40, 
            45, 50, 60, 70, 80, 90, 100, 125, 150, 175, 200, 225, 250]
    contourf=plt.tricontourf(lon, lat, rain_acc, levels=levels, 
           cmap='GnBu', extend='max')
    
    bounds=np.array(levels)
    norm = colors.BoundaryNorm(boundaries=bounds, ncolors=256)
    
    scatter=plt.scatter(x, y, c=rain_stations, s=50, cmap='GnBu', 
        zorder=10, norm=norm) 
    
    不幸的是,这也不起作用,因为
    BounaryNorm
    在级别之间线性插值

  • 因此,目前我必须覆盖数据的唯一方法是为
    tricontourf
    选择一个线性的水平序列(用
    np.linspace
    定义),然后应用第2点的方法。规范化散点图的颜色

    但是,我想做的是能够手动定义级别。 有人知道如何做到这一点吗


    最重要的是,为什么
    tricontourf
    忽略了
    vmin
    vmax

    查看您发布的链接和文档,
    pyplot.tricontourf
    似乎不接受
    vmin
    vmax
    。在您发布的示例中使用它的方式是使用
    norm
    参数:
    plt.tricontourf(x,y,z,norm=plt.Normalize(vmax=abs(zi.max(),vmin=-abs(zi.max())
    我也这样做了,但它仍然不起作用。这些级别仍然是自动设置的。顺便说一下,文档中没有提到
    vmin
    vmax
    tricontourf
    忽略。我在另一个问题上发现了这一点。