Картографические данные и данные ECMWF - PullRequest
0 голосов
/ 03 мая 2020

Я загрузил данные с платформы 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()

Но результат весьма разочаровывает. contourf representation

Я пытался использовать другую функцию, результат не тот же, но все же не тот, который я ожидаю. Также обратите внимание на странный размер сюжета. Я не использую функцию 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()

pcolormesh representation

Наконец, я попытался с примером, который я нашел здесь: 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())

Этот работает, когда я использую его непосредственно в своем коде (сразу после предыдущего кода). Example

На данный момент я совершенно растерялся. Я пробовал другую проекцию для атрибута transform, но, похоже, работает только PlateCarree.

Edit

Мой код работает правильно с другим набором данных. Temperature dataset

Я пока не знаю причину предыдущего поведения.

Редактировать 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)

Затем я получил этот сюжет. Их еще предстоит сделать. Methan distribution

Знаете ли вы лучший способ обработки? value является xarray.Dataset объектом. Как убрать белую линию в позиции lon = 0?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...