使用纬度和经度而不是提供的x-y坐标绘制地图时避免数据插值

问题描述 投票:1回答:1

我有一个二维numpy数组,其中包含一些数据,分别位于x和y坐标中。每个x和y点也都关联了一个纬度和经度(还有2维numpy数组)。海洋中有一些价值,但陆地上却没有。当我在x和y坐标上绘制数据时,得到以下信息:

plt.imshow(data)

Using imshow

然后,我想使用lon-lat坐标将此数据绘制在地图上。如果按照以下方式进行操作,由于进行了一些插值,因此我会获得一些陆上绘制的数据。

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

我可以在地图上使用的任何类型的绘图都获得相同的结果(pcolormesh,contour,contourf)。

如何避免这种情况,因为在陆地上没有数据可以显示,数值应为Nans?

谢谢!

数据是CMIP6项目的一部分。可以通过访问ocean.pangeo.io并运行以下代码来通过Pangeo进行访问:

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();
python matplotlib cartopy
1个回答
0
投票

所以我猜这是一个版本问题。我能够运行以下代码:

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())
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()

并获得以下图像:output image

这不显示任何这些问题。它在Python 3.7和3.8上与Matplotlib 3.2.1,xarray 0.15.0和CartoPy 0.17.0一起运行。

© www.soinside.com 2019 - 2024. All rights reserved.