【问题标题】:Problems with pcolormesh in CartopyCartopy 中 pcolormesh 的问题
【发布时间】:2017-07-07 22:39:23
【问题描述】:

我正在尝试将 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()

【问题讨论】:

    标签: python matplotlib cartopy


    【解决方案1】:

    您的代码让 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()
    

    【讨论】:

    • 看来这是问题所在,谢谢。我能问一下你为什么决定使用不同的纬度/经度网格,为什么选择层 1,3,4 而不是 0,1,2?
    • 我关注特征绘制的顺序。如果我将您的数据用于pcolormesh() 绘图,则所有海洋(和标线)都将被 pcolormesh 层隐藏。对于 zorder 的值,它们用于设置绘图的顺序,从而使我们能够产生我们需要的东西。值 (1,3,4) 可以产生与 (0,1,2) 不同或相同的输出。请注意,ax.gridlines() 也可以具有 zorder=some_value,您可以将其放在绘图顶部,并带有您可以猜测的值。要获得更好的地图,还需要考虑其他因素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多