为什么带有蒙板阵列的pcolor在以图形坐标投影时会填充不需要的四边形?

时间:2017-10-03 15:18:57

标签: python matplotlib cartopy

这是 preventing spurious horizontal lines for ungridded pcolor(mesh) data why does pcolor with masked array still fill quadrangles connecting to masked points, and how do I stop this? 的后续问题。在常规坐标系中,当我同时屏蔽坐标和数据时,我可以在两个部分中绘制环绕坐标的坐标,例如经度,现在我成功地在常规坐标中得不到不需要的四边形。但是,当我将其转换为地图坐标时,此解决方案将失败:

#!/usr/bin/env python3.6

from numpy import array, ma
from matplotlib.pyplot import figure, pcolor, savefig, axes

lons = array([[ 100.,  120.,  140.,  160.,  180.],
       [ 120.,  140.,  160.,  180., -160.],
       [ 140.,  160.,  180., -160., -140.],
       [ 160.,  180., -160., -140., -120.],
       [ 180., -160., -140., -120., -100.],
       [-160., -140., -120., -100.,  -80.]])

lats = array([[  0.,  10.,  20.,  30.,  40.],
       [  0.,  10.,  20.,  30.,  40.],
       [  0.,  10.,  20.,  30.,  40.],
       [  0.,  10.,  20.,  30.,  40.],
       [  0.,  10.,  20.,  30.,  40.],
       [  0.,  10.,  20.,  30.,  40.]])

bts = array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29]])

figure()
pcolor(ma.masked_where(lons>0, lons), ma.masked_where(lons>0, lats), bts)
pcolor(ma.masked_where(lons<0, lons), ma.masked_where(lons<0, lats), bts)
savefig("/tmp/ok.png")

# now with cartopy
import cartopy.crs as ccrs
proj = ccrs.Mollweide(central_longitude=0)
trans = proj.transform_points(ccrs.Geodetic(), lons, lats)
figure()
ax = axes(projection=proj)
ax.pcolormesh(ma.masked_where(lons>0, trans[:, :, 0]), ma.masked_where(lons>0, trans[:, :, 1]), ma.masked_where(lons>0, bts), transform=proj)
ax.pcolormesh(ma.masked_where(lons<0, trans[:, :, 0]), ma.masked_where(lons<0, trans[:, :, 1]), ma.masked_where(lons<0, bts), transform=proj)
savefig("/tmp/not_ok.png")

在常规坐标中,根据需要:

As desired

在地图坐标中,不需要的四边形又回来了:

Not as desired

请注意,任何正经度都映射到任何正地图坐标,反之亦然,因为当前投影的中心经度为零。当我另外掩盖等于±180的经度时,我仍然得到相同的情况。所以问题出在其他地方。如何在投影地图坐标中将pcolor绘制成两部分?

1 个答案:

答案 0 :(得分:1)

我的印象是,根据this issue引入到纸盒中的投影限制周围的包围坐标的解决方法实际上并不适用(?)。此代码尝试执行类似屏蔽不同区域的操作,但不知何故不会产生所需的结果。

现在,另一方面,遍布全球的方面问题无论如何只出现在pcolormesh,而不是pcolor;可能是由于两种情况下使用的网格不同 因此,当使用pcolor时,情节看起来符合要求。

import cartopy.crs as ccrs
proj = ccrs.Mollweide(central_longitude=0)
trans = proj.transform_points(ccrs.Geodetic(), lons, lats)
plt.figure()
ax = plt.axes(projection=proj)
ax.pcolor(ma.masked_where(trans[:, :, 0]>0, trans[:, :, 0]), ma.masked_where(trans[:, :, 0]>0, trans[:, :, 1]), ma.masked_where(trans[:, :, 0]>0, bts), transform=proj)
ax.pcolor(ma.masked_where(trans[:, :, 0]<0, trans[:, :, 0]), ma.masked_where(trans[:, :, 0]<0, trans[:, :, 1]), ma.masked_where(trans[:, :, 0]<0, bts), transform=proj)

plt.show()

enter image description here