Я использую cartopy
для отображения KDE, наложенного на карту мира. Первоначально я использовал проекцию ccrs.PlateCarree
без проблем, но в тот момент, когда я попытался использовать другую проекцию, мне показалось, что масштаб проекции резко увеличился. Для справки я привел пример, который вы можете протестировать на своем компьютере ниже (просто закомментируйте две строки projec
, чтобы переключаться между проекциями)
from scipy.stats import gaussian_kde
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
projec = ccrs.PlateCarree()
#projec = ccrs.InterruptedGoodeHomolosine()
fig = plt.figure(figsize=(12, 12))
ax = fig.add_subplot(projection=projec)
np.random.seed(1)
discrete_points = np.random.randint(0,10,size=(2,400))
kde = gaussian_kde(discrete_points)
x, y = discrete_points
# https://www.oreilly.com/library/view/python-data-science/9781491912126/ch04.html
resolution = 1
x_step = int((max(x)-min(x))/resolution)
y_step = int((max(y)-min(y))/resolution)
xgrid = np.linspace(min(x), max(x), x_step+1)
ygrid = np.linspace(min(y), max(y), y_step+1)
Xgrid, Ygrid = np.meshgrid(xgrid, ygrid)
Z = kde.evaluate(np.vstack([Xgrid.ravel(), Ygrid.ravel()]))
Zgrid = Z.reshape(Xgrid.shape)
ext = [min(x)*5, max(x)*5, min(y)*5, max(y)*5]
earth = plt.cm.gist_earth_r
ax.add_feature(cfeature.NaturalEarthFeature('physical', 'land', '50m',
edgecolor='black', facecolor="none"))
ax.imshow(Zgrid,
origin='lower', aspect='auto',
extent=ext,
alpha=0.8,
cmap=earth, transform=projec)
ax.axis('on')
ax.get_xaxis().set_visible(True)
ax.get_yaxis().set_visible(True)
ax.set_xlim(-30, 90)
ax.set_ylim(-60, 60)
plt.show()
Вы заметите, что при использовании проекции ccrs.PlateCarree()
KDE удобно размещается над Африкой, однако при использовании проекции ccrs.InterruptedGoodeHomolosine()
вы вообще не видите карту мира. Это потому, что карта мира имеет огромный масштаб. Ниже приведены изображения обоих примеров:
Прерванная проекция Гуда Гомолосин (стандартное увеличение):
Прерванная проекция Гуда Гомолосина (уменьшено):
Если бы кто-нибудь мог объяснить, почему это происходит, и как это исправить, чтобы я мог нанести одни и те же данные на разные проекции, это был бы очень признателен.
РЕДАКТИРОВАТЬ:
Я также хотел бы указать, что я пытался добавить transform=projec
в строку 37 в примере, который я включил, а именно:
ax.add_feature(cfeature.NaturalEarthFeature('physical', 'land', '50m',
edgecolor='black', facecolor="none", transform=projec))
Однако это не помогло. Фактически, казалось, что после добавления этого мира карта мира больше не появлялась.
РЕДАКТИРОВАТЬ:
В ответ на ответ JohanC я получаю следующий сюжет при использовании этого кода:
И уменьшено: