Как построить океанские течения с картопией - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь построить файл netCDF4, содержащий океанические течения, из базы данных NASA для проекта, но продолжаю получать ошибки, такие как «координаты x и y не совместимы с формой векторных компонентов».

Я попытался изменить streamplot на контур (когда я это сделал, он сказал, что это должен быть 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()

Iхотел бы, чтобы он работал таким образом, чтобы на графике были видны океанические течения, а анимация показывала движение частиц в течениях. Я действительно не очень разбираюсь в этом, поэтому и спрашиваю. Вот ссылка, по которой я получил файл: https://podaac -opendap.jpl.nasa.gov / opendap / hyrax / allData / oscar / preview / L4 / oscar_third_deg / oscar_vel2019.nc.gz.html

1 Ответ

2 голосов
/ 21 октября 2019

ОК, я скачал данные. Проблема в том, что u и v 4-мерные, поэтому вам нужно выжать измерение «глубина». 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()

enter image description here

...