Python 3.x 如何用Cartopy绘制洋流图

Python 3.x 如何用Cartopy绘制洋流图,python-3.x,matplotlib,cartopy,netcdf4,Python 3.x,Matplotlib,Cartopy,Netcdf4,我试图为一个项目绘制一个netCDF4文件,其中包含来自NASA数据库的洋流,但我不断得到错误,例如“x和y坐标与矢量分量的形状不兼容” 我曾尝试将流线图更改为轮廓图(当我这样做时,它说它需要是一个2d阵列),我试图更改,但无法使其工作 import os import matplotlib.pyplot as plt from netCDF4 import Dataset as netcdf_dataset import numpy as np import cartopy.crs as cc

我试图为一个项目绘制一个netCDF4文件,其中包含来自NASA数据库的洋流,但我不断得到错误,例如“x和y坐标与矢量分量的形状不兼容”

我曾尝试将流线图更改为轮廓图(当我这样做时,它说它需要是一个2d阵列),我试图更改,但无法使其工作

import os
import matplotlib.pyplot as plt
from netCDF4 import Dataset as netcdf_dataset
import numpy as np
import cartopy.crs as ccrs

fname = "oscar_vel2019.nc.gz.nc"

data=netcdf_dataset(fname)
v = data.variables['v'][0, :, :, :]
vf = data.variables['vm'][0, :, :, :]
u = data.variables['u'][0, :, :, :]
uf = data.variables['um'][0, :, :, :]
lats = data.variables['latitude'][:]
lons = data.variables['longitude'][:]
ax = plt.axes(projection=ccrs.PlateCarree())

mymap=plt.streamplot(lons, lats, u, v, 60, transform=ccrs.PlateCarree())

ax.coastlines()

plt.show()

我希望它能够在绘图上显示洋流,并通过动画显示洋流中粒子的运动。我真的不知道这是为什么我问。这是我获取文件的链接:

好的,我下载了数据。问题是u和v是四维的,所以你需要挤出“深度”维度。Cartopy也不接受大于180的经度,而且你可能无法逃脱绘制整个流程的惩罚。此外,密度=60将永远

这很难看,但给你的想法

import xarray as xr
import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt

with xr.open_dataset('/Users/jklymak/downloads/oscar_vel2019.nc.gz.nc') as ds:
    print(ds)

    ax = plt.axes(projection=ccrs.PlateCarree())

    dec = 10
    lon = ds.longitude.values[::dec]
    lon[lon>180] = lon[lon>180] - 360
    mymap=plt.streamplot(lon, ds.latitude.values[::dec], ds.u.values[0, 0, ::dec, ::dec], ds.v.values[0, 0, ::dec, ::dec], 6, transform=ccrs.PlateCarree())
    ax.coastlines()
    plt.show()

好的,我下载了数据。问题是u和v是四维的,所以你需要挤出“深度”维度。Cartopy也不接受大于180的经度,而且你可能无法逃脱绘制整个流程的惩罚。此外,密度=60将永远

这很难看,但给你的想法

import xarray as xr
import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt

with xr.open_dataset('/Users/jklymak/downloads/oscar_vel2019.nc.gz.nc') as ds:
    print(ds)

    ax = plt.axes(projection=ccrs.PlateCarree())

    dec = 10
    lon = ds.longitude.values[::dec]
    lon[lon>180] = lon[lon>180] - 360
    mymap=plt.streamplot(lon, ds.latitude.values[::dec], ds.u.values[0, 0, ::dec, ::dec], ds.v.values[0, 0, ::dec, ::dec], 6, transform=ccrs.PlateCarree())
    ax.coastlines()
    plt.show()

如果lat和Lon是一维变量,您需要使用网格网格来制作与u和vI相同的大小,如果我问了一个愚蠢的问题,我很抱歉,但我以前没有做过类似的事情,所以我不确定网格网格将如何工作。那么,你介意举个例子来说明我将如何做到这一点吗?我早就试过了;x、 y=np.meshgrid(u,v)mymap=plt.streamplot(lons,lats,x,y,60,transform=ccrs.PlateCarree())但这给了我一个内存错误:MemoryError:无法分配具有形状(577681,577681)和数据类型float64的数组。如果lat和Lon是1d变量,则应该使用meshgrid lat和Lon而不是u和v。如果它们已经是两个d,那么这当然不会有帮助。我尝试使用一个简化的数据集,但是尽管内存错误不再出现,现在我得到了这个错误;ValueError:x和y坐标与矢量组件的形状不兼容。有人能帮我解决一下这将表明什么以及我需要改变什么吗?如果lat和Lon是一维变量,你需要使用网格使其与u和vI的大小相同,如果我问了一个愚蠢的问题,我很抱歉,但我以前没有做过类似的事情,所以我不确定网格将如何工作。那么,你介意举个例子来说明我将如何做到这一点吗?我早就试过了;x、 y=np.meshgrid(u,v)mymap=plt.streamplot(lons,lats,x,y,60,transform=ccrs.PlateCarree())但这给了我一个内存错误:MemoryError:无法分配具有形状(577681,577681)和数据类型float64的数组。如果lat和Lon是1d变量,则应该使用meshgrid lat和Lon而不是u和v。如果它们已经是两个d,那么这当然不会有帮助。我尝试使用一个简化的数据集,但是尽管内存错误不再出现,现在我得到了这个错误;ValueError:x和y坐标与矢量组件的形状不兼容。有人能帮我解决这个问题吗?我需要改变什么?