在Cartopy中使用pcolormesh出现问题

4
我正在尝试将Cartopy example plot 用于圆形南极立体投影图并将数据添加到其中。我有几个问题。
首先,在示例代码中,陆地特征被添加到海洋特征之前。当我这样做时,我得到的是一张只有海洋的地图。我反转了以下代码中调用的顺序,得到了一张有陆地和海洋的地图。为什么南极的示例可以使用其他顺序?
其次,更重要的是,我弄不清楚为什么我的pcolormesh调用没有任何效果。
我正在使用Python 2.7.7、matplotlib 1.5.1和Cartopy 0.15.1。
import matplotlib.path as mpath
import matplotlib.pyplot as plt
import numpy as np

import cartopy.crs as ccrs
import cartopy.feature

lats = np.linspace(60,90,30)
lons = np.linspace(0,360,200)
X,Y = np.meshgrid(lons,lats)
Z = np.random.normal(size = X.shape)

def main():
    fig = plt.figure(figsize=[10, 5])
    ax = plt.subplot(1, 1, 1, projection=ccrs.NorthPolarStereo())
    fig.subplots_adjust(bottom=0.05, top=0.95,
                        left=0.04, right=0.95, wspace=0.02)

    # Limit the map to -60 degrees latitude and below.
    ax.set_extent([-180, 180, 60, 60], ccrs.PlateCarree())

    ax.gridlines()

    ax.add_feature(cartopy.feature.OCEAN)
    ax.add_feature(cartopy.feature.LAND)

    # Compute a circle in axes coordinates, which we can use as a boundary
    # for the map. We can pan/zoom as much as we like - the boundary will be
    # permanently circular.
    theta = np.linspace(0, 2*np.pi, 100)
    center, radius = [0.5, 0.5], 0.5
    verts = np.vstack([np.sin(theta), np.cos(theta)]).T
    circle = mpath.Path(verts * radius + center)

    ax.set_boundary(circle, transform=ax.transAxes)
    ax.pcolormesh(X,Y,Z,transform=ccrs.PlateCarree())


    plt.show()


if __name__ == '__main__':
    main()
1个回答

4
你的代码让cartopy决定地图上要素绘制的顺序,因此一些要素可能被隐藏而没有任何提示。可以显式指定绘制顺序。
要素绘制的顺序由zorder控制,可以在大多数绘图语句中使用zorder=integer进行指定。这里是一个修改后的代码,可以产生更好的结果。
# your data
lats = np.linspace(60, 90, 30)
lons = np.linspace(0, 360, 160)
X,Y = np.meshgrid(lons, lats)
Z = np.random.normal(size = X.shape)

# new data for pcolormesh plot
latz = np.linspace(75, 90, 15)
lonz = np.linspace(0, 360, 160)
X1,Y1 = np.meshgrid(lonz, latz)
Z1 = np.random.normal(size = X1.shape)

def main():
    fig = plt.figure(figsize=[10, 10])
    ax = plt.subplot(1, 1, 1, projection=ccrs.NorthPolarStereo())
    fig.subplots_adjust(bottom=0.05, top=0.95,
                        left=0.04, right=0.95, wspace=0.02)

    # Limit the map to -60 degrees latitude and below.
    ax.set_extent([-180, 180, 60, 60], ccrs.PlateCarree())

    ax.gridlines()

    # zorder can be used to arrange what is on top
    ax.add_feature(cartopy.feature.LAND, zorder=4)   # land is specified to plot above ...
    ax.add_feature(cartopy.feature.OCEAN, zorder=1)  # ... the ocean

    # Compute a circle in axes coordinates, which we can use as a boundary
    # for the map. We can pan/zoom as much as we like - the boundary will be
    # permanently circular.
    theta = np.linspace(0, 2*np.pi, 100)
    center, radius = [0.5, 0.5], 0.5
    verts = np.vstack([np.sin(theta), np.cos(theta)]).T
    circle = mpath.Path(verts * radius + center)

    ax.set_boundary(circle, transform=ax.transAxes)
    # pcolormesh is specified to plot on top of the ocean but below land
    ax.pcolormesh(X1, Y1, Z1, transform=ccrs.PlateCarree(), zorder=3)

    plt.show()

if __name__ == '__main__':
    main()

enter image description here


看起来这就是问题所在,谢谢。我能问一下为什么您决定使用不同的纬度/经度网格,并选择 1、3、4 层而不是 0、1、2 层吗? - Daniel Watkins
我专注于特征绘制的顺序。如果我在pcolormesh()绘图中使用您的数据,所有海洋(和经纬网)都将被pcolormesh层隐藏。对于zorder的值,它们用于设置绘图的顺序,从而使我们能够产生所需的结果。值(1,3,4)可以产生与(0,1,2)不同或相同的输出。请注意,ax.gridlines()也可以具有zorder = some_value,您可以猜测一个值将其置于绘图的顶部。为了获得更好的地图,还有其他因素需要考虑。 - swatchai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接