掩盖立方体的功能

时间:2014-11-26 14:27:24

标签: cartopy python-iris

我想从全局多维数据集中绘制数据,但仅用于国家/地区列表。所以我根据国家/地区选择了一个子立方体。 "边界框"。

到目前为止一切顺利。我正在寻找的是一种简单的方法来掩盖多维数据集的所有点,这些点不属于我的任何国家(表示为特征),因此只有多维数据集中的那些点位于任何一个我的特征被绘制出来。

非常感谢任何想法=)

1 个答案:

答案 0 :(得分:5)

您可以直接在绘图阶段实现此目的,而不是在虹膜内屏蔽立方体。我通过设置pcolor返回的艺术家的剪辑路径来解决这个问题。方法是从要素创建几何图形列表(在本例中为自然地球的国家,它们可以来自shapefile),然后将这些几何图形转换为可以剪裁图像的matplotlib路径。我将详细介绍这种方法,希望这足以让你开始:

我首先定义了一个函数来检索对应于给定国家/地区名称的Shapely几何图形,几何图形来自Natural Earth 110m管理边界shapefile,通过cartopy界面访问。

然后我定义了第二个函数,它是iris.plot.pcolor函数的包装器,它创建了图并将其剪辑到给定的几何图形。

现在我需要做的就是正常设置图,但是使用绘图包装而不是直接调用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()

结果如下:

full map

selected countries

如果您想使用iris.plot.pcolormesh,则需要稍微修改绘图功能。这是针对matplotlib问题的解决方法,该问题目前包含在cartopy中。修改后的版本如下所示:

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