2017-07-07 6 views
2

私はCartole example plotを南極の北極立体図に適用し、それにデータを追加しようとしています。私はいくつかの質問があります。Cartolormeshでのpcolormeshの問題

まず、サンプルコードでは、海の特徴の前に土地の特徴が追加されています。私がそれをしたとき、私は海だけの地図を得ました。私は以下のコードで呼び出しの順序を逆にし、陸と海の地図を取得します。 South Polarの例で他の注文が働いたのはなぜですか?

さらに重要なことに、私の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() 

答えて

2

あなたのコードは、結果として、一部の機能はありません手掛かりを非表示にすることができ、地図上のフィーチャープロットの順序を決定するために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

+0

これは、おかげで問題だったように見えます。なぜ違う緯度/経度グリッドを使用することにしたのか、どうして0,1,2の代わりに1,3,4のレイヤーを選択したのか尋ねることはできますか? –

+0

私はフィーチャのプロットの順序に焦点を当てます。私があなたのデータを 'pcolormesh()'プロットに使うと、すべての海洋(および目盛り)はpcolormesh層によって隠されます。 zorderの値については、プロットの順序を設定するために使用されるため、必要なものを生成することができます。値(1,3,4)は(0,1,2)で異なる出力を生成することができます。 ax.gridlines()はzorder = some_valueを持つこともできますが、あなたが推測できる値でプロットの上に表示することができます。より良いマップを得るためには、考慮すべき他の要素があります。 – swatchai