【发布时间】:2019-07-23 08:26:51
【问题描述】:
我正在尝试绘制具有北 (0-40N) 和南 (0-40S) 半球的正投影以及中纬度 (60N-60S) 的 Mollweide 投影的球体地图。我得到以下情节:
这显示了一个问题:半球形图周围有一个带有切角的方形边界框。请注意,所有三个图的颜色范围都相同(-90 到 90)。
然而,当我在不限制其范围的情况下绘制一个半球时,我得到一个圆形边界框,正如正交投影所预期的那样:
使用plt.xlim(-90,-50) 会导致垂直条纹,而plt.ylim(-90,-50) 会导致水平条纹,所以这也不是解决方案。
如何在保持圆形边界框的同时限制正交投影的纬度范围?
生成上述图表的代码:
import numpy as np
from matplotlib import pyplot as plt
import cartopy.crs as ccrs
# Create dummy data, latitude from -90(S) to 90 (N), lon from -180 to 180
theta, phi = np.meshgrid(np.arange(0,180),np.arange(0,360));
theta = -1*(theta.ravel()-90)
phi = phi.ravel()-180
radii = theta
# Make masks for hemispheres and central
mask_central = np.abs(theta) < 60
mask_north = theta > 40
mask_south = theta < -40
data_crs= ccrs.PlateCarree() # Data CRS
# Grab map projections for various plots
map_proj = ccrs.Mollweide(central_longitude=0)
map_proj_N = ccrs.Orthographic(central_longitude=0, central_latitude=90)
map_proj_S = ccrs.Orthographic(central_longitude=0, central_latitude=-90)
fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 2,projection=map_proj)
im1 = ax1.scatter(phi[mask_central],
theta[mask_central],
c = radii[mask_central],
transform=data_crs,
vmin = -90,
vmax = 90,
)
ax1.set_title('Central latitudes')
ax_N = fig.add_subplot(2, 2, 1, projection=map_proj_N)
ax_N.scatter(phi[mask_north],
theta[mask_north],
c = radii[mask_north],
transform=data_crs,
vmin = -90,
vmax = 90,
)
ax_N.set_title('Northern hemisphere')
ax_S = fig.add_subplot(2, 2, 2, projection=map_proj_S)
ax_S.scatter(phi[mask_south],
theta[mask_south],
c = radii[mask_south],
transform=data_crs,
vmin = -90,
vmax = 90,
)
ax_S.set_title('Southern hemisphere')
fig = plt.figure()
ax = fig.add_subplot(111,projection = map_proj_N)
ax.scatter(phi,
theta,
c = radii,
transform=data_crs,
vmin = -90,
vmax = 90,
)
ax.set_title('Northern hemisphere')
plt.show()
【问题讨论】:
-
你不能。但也许您只是想在数据周围画一个圆圈?
-
@ImportanceOfBeingErnest 可行。我已经在尝试将网格线放入除 plate-carree 之外的投影中,因此只需禁用轴(或将它们设置为白色/完全透明等)然后绘制网格圆圈和线条将是我唯一的选择吗?
-
可能的替代方法是继承
cartopy.crs.Orthographic并更改负责在数据周围绘制线条的部分;但我还没有检查你需要为此潜水多深。对于一般情况,这也让人感觉不受欢迎,因为这样你可能会让边框与数据重叠。
标签: python matplotlib map-projections cartopy