2

我想绘制来自全球多维数据集的数据,但仅限于国家列表。所以我根据国家的“边界框”选择了一个子立方体。

到目前为止,一切都很好。我正在寻找的是一种简单的方法来掩盖不属于我的任何国家的立方体的所有点(表示为特征),以便只有立方体的那些点位于我的任何特征内被绘制。

非常感谢任何想法=)

4

1 回答 1

6

您可以在绘图阶段直接实现这一点,而不是在 iris 中隐藏立方体。我通过设置返回的艺术家的剪辑路径来解决这个问题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()

结果如下所示:

完整地图

选定的国家

如果要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 回答