如何使用 matplotlib 在 cartopy 极地立体图中获得平滑的网格线?

How do I get smooth gridlines in cartopy polar stereographic plots with matplotlib?

使用 matplotlib 和 cartopy 的 NorthPolarStereo 投影绘图时,恒定纬度网格线(平行线)不是光滑的圆。

这是一个最小的工作示例:

from matplotlib import pyplot
import cartopy.crs

ax = pyplot.axes(projection=cartopy.crs.NorthPolarStereo())
ax.set_extent((-180, 180, 60, 90), crs=cartopy.crs.PlateCarree())
ax.gridlines()

pyplot.show()

如您所见,纬线是点之间的一系列直线段。每条线上没有足够的点来使它们看起来平滑。我怎样才能使平行线更圆?

这是因为默认阈值对于此用例来说太大了。这不是 Cartopy 投影界面的 user-controllable 部分。您可以使用私有 _threshold 属性绕过它,将它除以 100 对于您的用例来说看起来很合理:

from matplotlib import pyplot
import cartopy.crs

hacked_proj = cartopy.crs.NorthPolarStereo()
hacked_proj._threshold /= 100.
ax = pyplot.axes(projection=hacked_proj)
ax.set_extent((-180, 180, 60, 90), crs=cartopy.crs.PlateCarree())
ax.gridlines()

pyplot.show()

这不是一个很好的解决方案,因为它使用了 Stereographic class 的实现细节,最好在 Cartopy 中对此进行更好的设置。使用此用例在 Cartopy Github 存储库上开一张票将是一个好的开始 https://github.com/SciTools/cartopy/issues.

问:如何使平行线更圆?

答:您需要 gridlines() 创建的 gridliner 对象的 n_steps 属性 的更大值。它的默认值为30。这里是将值设置为90的相关代码,并生成更好的绘图。

gl = ax.gridlines(draw_labels=False, xlocs=None, ylocs=None)
gl.n_steps = 90

参见参考资料 here

示例输出: