Избегайте интерполяции данных при построении карты, используя широту и долготу вместо предоставленных координат xy - PullRequest
1 голос
/ 19 марта 2020

У меня есть массив 2-d numpy с некоторыми данными в координатах x и y. С каждой точкой x и y также связаны широта и долгота (также 2-d numpy массивы). Есть некоторые ценности в океанах, но не над сушей. Когда я строю данные в координатах x и y, я получаю следующее:

plt.imshow(data)

Using imshow

Затем я хочу чтобы построить эти данные на карте, используя координаты Лон-лат. Если я сделаю это следующим образом, я получу некоторые данные на графике, так как используется некоторая интерполяция.

import cartopy.crs as ccrs
ax = plt.axes(projection=ccrs.Robinson())
plt.pcolor(lon, lat, data, transform=ccrs.PlateCarree())
ax.coastlines()

enter image description here

Я получаю то же самое для любой тип графика, который я могу использовать на карте (pcolorme sh, contour, contourf).

Как этого избежать, поскольку на земле нет данных, где значения должны быть Nans?

Спасибо!

Данные являются частью проекта CMIP6. Доступ к нему можно получить через Pangeo, зайдя на сайт ocean.pangeo.io и выполнив следующий код:

from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import xarray as xr
import zarr
import gcsfs
import intake
from dask.distributed import Client
from dask_kubernetes import KubeCluster

cluster = KubeCluster()
cluster.adapt(minimum=1, maximum=20, interval='2s', wait_count=10)
client = Client(cluster)
client

url = 'https://raw.githubusercontent.com/NCAR/intake-esm-datastore/master/catalogs/pangeo-cmip6.json'
col = intake.open_esm_datastore(url)
col_hist = col.search(variable_id='o2', table_id='Omon', experiment_id='historical')
dict_hist = col_hist.to_dataset_dict(zarr_kwargs={'consolidated': True})

import cartopy.crs as ccrs
import cartopy.feature as cfeature

models = list(dict_hist.keys())
model = models[5]
ds = dict_hist[model]
sub1 = ds.o2.sel(member_id=ds.member_id.values[0], time=ds.time.values[0])
sub2 = sub1.sel(lev=100, method='nearest')

ax = plt.axes(projection=ccrs.Robinson())
q = sub2.plot(ax=ax, transform=ccrs.PlateCarree(), x='lon', y='lat', vmin=0, vmax=0.4, cbar_kwargs={'shrink': 0.5})
ax.set_global(); ax.coastlines();

1 Ответ

1 голос
/ 24 марта 2020

Отредактировано для учета комментариев к данным.

Проблема с заполненными областями связана с переносом. То, что вы видите, это построение графиков данных, например, от +179,8 (правая сторона графика) до -178,4 (левая сторона графика) - CartoPy неправильно обрезает, поэтому у вас есть длинные полосы построения данных по карте. В областях с другими нанесенными данными эти полосы покрыты. Там, где у вас нет данных (т.е. на суше), просвечивают полосы.

Один из обходных путей - отрегулировать начало проекции, что может устранить некоторые из этих линий. У меня был некоторый успех с небольшими корректировками (~ 1 градус), но лучше всего было бы сделать так, чтобы левый и правый края исходной области данных были левым и правым краями графика. Для этого набора данных левый край имеет +73,5 долготы, поэтому мы хотим, чтобы начало координат было равно +180, что составляет -107,5 долготы:

import intake
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt

url = ('https://raw.githubusercontent.com/NCAR/'
       'intake-esm-datastore/master/catalogs/pangeo-cmip6.json')

col = intake.open_esm_datastore(url)
col_hist = col.search(variable_id='o2', table_id='Omon', experiment_id='historical')
dict_hist = col_hist.to_dataset_dict(zarr_kwargs={'consolidated': True})

models = list(dict_hist.keys())
model = models[5]
ds = dict_hist[model]
sub1 = ds.o2.sel(member_id=ds.member_id.values[0], time=ds.time.values[0])
sub2 = sub1.sel(lev=100, method='nearest')

ax = plt.axes(projection=ccrs.Robinson(central_longitude=-107.5))
q = sub2.plot(ax=ax, transform=ccrs.PlateCarree(), x='longitude', y='latitude',
              vmin=0, vmax=0.4, cbar_kwargs={'shrink': 0.5})
ax.coastlines()
ax.set_global()

, что дает мне следующее изображение:

data plot

В идеале, CartoPy справится с этим правильно, но сейчас есть много проблем с этим (например, этот ).

...