2

グローバル キューブからデータをプロットしたいのですが、国のリストに対してのみです。そこで、国の「バウンディング ボックス」に従ってサブキューブを選択します。

ここまでは順調ですね。私が探しているのは、自分の国 (フィーチャとして表される) のいずれにも該当しない立方体のすべてのポイントをマスクして、フィーチャのいずれかに含まれる立方体のポイントのみをマスクする簡単な方法です。プロットされます。

どんなアイデアでも大歓迎です=)

4

1 に答える 1

6

これは、アイリス内で立方体をマスクするのではなく、プロット段階で直接実現できます。によって返されるアーティストのクリップ パスを設定することで、これに取り組みましたpcolor。この方法は、フィーチャ (この場合、Natural Earth の国、シェープファイルからのものである可能性があります) からジオメトリのリストを作成し、これらのジオメトリを、画像をクリップできる matplotlib パスに変換することです。この方法について詳しく説明します。うまくいけば、これで十分に始めることができます。

最初に、指定された国名に対応する Shapely ジオメトリを取得する関数を定義しました。ジオメトリは、Natural Earth 110m 行政境界シェープファイルから取得され、cartopy インターフェースを介してアクセスします。

iris.plot.pcolor次に、プロットを作成して指定されたジオメトリにクリップする関数のラッパーである 2 番目の関数を定義しました。

あとは、プロットを通常どおりにセットアップするだけですが、iris.plot.pcolor関数を直接呼び出すのではなく、プロット ラッパーを使用します。

完全な例を次に示します。

import cartopy.crs as ccrs
from cartopy.io.shapereader import natural_earth, Reader
from cartopy.mpl.patch import geos_to_path
import iris
import iris.plot as iplt
import matplotlib.pyplot as plt
from matplotlib.path import Path


def get_geometries(country_names):
    """
    Get an iterable of Shapely geometries corrresponding to given countries.

    """
    # Using the Natural Earth feature interface provided by cartopy.
    # You could use a different source, all you need is the geometries.
    shape_records = Reader(natural_earth(resolution='110m',
                                         category='cultural',
                                         name='admin_0_countries')).records()
    geoms = []
    for country in shape_records:
        if country.attributes['name_long'] in country_names:
            try:
                geoms += country.geometry
            except TypeError:
                geoms.append(country.geometry)
    return geoms, ccrs.PlateCarree()._as_mpl_transform


def pcolor_mask_geoms(cube, geoms, transform):
    path = Path.make_compound_path(*geos_to_path(geoms))
    im = iplt.pcolor(cube)
    im.set_clip_path(path, transform=transform)


# First plot the full map:
cube = iris.load_cube(iris.sample_data_path('air_temp.pp'))
plt.figure(figsize=(12, 6))
ax1 = plt.axes(projection=ccrs.PlateCarree())
ax1.coastlines()
iplt.pcolor(cube)

# Now plot just the required countries:
plt.figure(figsize=(12, 6))
ax2 = plt.axes(projection=ccrs.PlateCarree())
ax2.coastlines()
countries = [
    'United States',
    'United Kingdom',
    'Saudi Arabia',
    'South Africa',
    'Nigeria']
geoms, transform = get_geometries(countries)
pcolor_mask_geoms(cube, geoms, transform(ax2))

plt.show()

その結果は次のようになります。

フルマップ

選ばれた国

代わりに使用iris.plot.pcolormeshする場合は、プロット関数を少し変更する必要があります。これは、現在 cartopy に含まれている matplotlib の問題の回避策によるものです。変更されたバージョンは次のようになります。

def pcolor_mask_geoms(cube, geoms, transform):
    path = Path.make_compound_path(*geos_to_path(geoms))
    im = iplt.pcolormesh(cube)
    im.set_clip_path(path, transform=transform)
    try:
        im._wrapped_collection_fix.set_clip_path(path, transform)
    except AttributeError:
        pass
于 2015-07-10T16:08:10.450 に答える