我想从全局多维数据集中绘制数据,但仅用于国家/地区列表。所以我根据国家/地区选择了一个子立方体。 "边界框"。
到目前为止一切顺利。我正在寻找的是一种简单的方法来掩盖多维数据集的所有点,这些点不属于我的任何国家(表示为特征),因此只有多维数据集中的那些点位于任何一个我的特征被绘制出来。
非常感谢任何想法=)
答案 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()
结果如下:
如果您想使用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