Я загрузил данные с платформы ECMWF Mars и пытаюсь их визуализировать, используя Cartopy. Я читаю их с помощью библиотеки xarray и движка cfgrib.
xarray.open_dataset(file.filepath, engine="cfgrib")
Чтобы отобразить эти данные, я в основном делаю это:
lons = value.longitude
lats = value.latitude
data = value.data
xx,yy = np.meshgrid(lons, lats) # I tried with xx,yy and lons, lats values
ax.contourf(xx, yy, data, transform=ccrs.PlateCarree())
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.set_global()
Но результат весьма разочаровывает.
Я пытался использовать другую функцию, результат не тот же, но все же не тот, который я ожидаю. Также обратите внимание на странный размер сюжета. Я не использую функцию plt.tight_layout()
.
lons = value.longitude
lats = value.latitude
data = value.data
xx,yy = np.meshgrid(lons, lats)
ax.pcolormesh(xx, yy, data, transform=ccrs.PlateCarree())
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.set_global()
Наконец, я попытался с примером, который я нашел здесь: https://scitools.org.uk/cartopy/docs/latest/tutorials/understanding_transform.html
lon = np.linspace(0, 360, 25)
lat = np.linspace(30, 70, 25)
lon2d, lat2d = np.meshgrid(lon, lat)
data = np.cos(np.deg2rad(lat2d) * 4) + np.sin(np.deg2rad(lon2d) * 4)
ax.contourf(lon, lat, data,transform=ccrs.PlateCarree())
Этот работает, когда я использую его непосредственно в своем коде (сразу после предыдущего кода).
На данный момент я совершенно растерялся. Я пробовал другую проекцию для атрибута transform, но, похоже, работает только PlateCarree.
Edit
Мой код работает правильно с другим набором данных.
Я пока не знаю причину предыдущего поведения.
Редактировать 2
Причиной является неправильная форма данных мне sh. Проблема с этими данными заключается в том, что они определены как одномерные массивы (1D для широты, 1D для долготы, 1D для данных). Я могу отобразить данные, создав обычную me sh.
lons = value.longitude.data
lats = value.latitude.data
data = value.data
# Just to adjuste the min and max of the normalizer
print('Min value: ' + str(min(data)))
print('Max value: ' + str(max(data)))
# Previous tests
# data, lons = cutil.add_cyclic_point(data, coord=lons)
# xx, yy = np.meshgrid(lons, lats)
# ax.contourf(lons, lats, data, levels=100, transform=ccrs.PlateCarree(), cmap=cmap, norm=normalizer)
# Create grid values first.
xi = np.linspace(min(lons), max(lons), 180)
yi = np.linspace(min(lats), max(lats), 180)
# Perform linear interpolation of the data (x,y)
# on a grid defined by (xi,yi)
triang = tri.Triangulation(lons, lats)
interpolator = tri.LinearTriInterpolator(triang, data)
Xi, Yi = np.meshgrid(xi, yi)
zi = interpolator(Xi, Yi)
ax.contourf(Xi, Yi, zi, levels=100, transform=ccrs.PlateCarree(), cmap=cmap, norm=normalizer)
Затем я получил этот сюжет. Их еще предстоит сделать.
Знаете ли вы лучший способ обработки? value
является xarray.Dataset
объектом. Как убрать белую линию в позиции lon = 0?