user14783839
user14783839

Reputation: 25

working with netCDF on python with matplotlib

So I am pretty new in programming, currently doing some research on netCDF .nc files to work with python. I have the following code which I am sure it will not work. The objective here is to plot a graph simple line graph of 10m u-component of winds over time. The problem I think is that 10m u-component of winds has 4D shape of (time=840, expver=2, latitude=19, longitude=27) while time being only (time=840). Any replies or ideas will be much appreciated! The code is as shown:

from netCDF4 import Dataset
import matplotlib.pyplot as plt
import numpy as np

nc = Dataset(r'C:\WAIG\Python\ERA5_py01\Downloaded_nc_file/test_era5.nc','r')

for i in nc.variables:
    print(i)

lat = nc.variables['latitude'][:]
lon = nc.variables['longitude'][:]
time = nc.variables['time'][:]
u = nc.variables['u10'][:]


plt.plot(np.squeeze(u), np.squeeze(time))
plt.show()

Upvotes: 0

Views: 2380

Answers (2)

iury simoes-sousa
iury simoes-sousa

Reputation: 1590

Have you tried using xarray?

I think that it will be easier for you to read the netCDF4 file and plot it using matplotlib.

This is straight forward:

import xarray as xr
ds = xr.open_dataset('C:\WAIG\Python\ERA5_py01\Downloaded_nc_file/test_era5.nc')

This line will plot the timeseries of the horizontal mean U10

ds['u10'].mean(['longitude','latitude']).plot()

You can also select by the value or index in a specific dimension using sel and isel methods:

This line selects the 10th latitude and 5th longitude and plot it. In this case I am interested in specific indexes for latitude and longitude, not in the real units.

ds['u10'].isel(latitude=10,longitude=5).plot()

This line selects the nearest value of latitude and longitude to the given values and plot it. In this case, I am interested in the values of latitude and longitude in the real units.

ds['u10'].sel(latitude=-15,longitude=40,method='nearest').plot()

See their documentation to learn more about xarray.

I hope this solution is better for your case and it also introduce you this great tool. Please, let me know if you still need some help with this.

Upvotes: 1

DopplerShift
DopplerShift

Reputation: 5843

Right, you have winds that represent the 10m wind at every location of the model grid (lat,lon) as well as dimensioned on exper--not sure what that last one is. You need to select a subset of u. For example, let's pick exper=1, and lat/lon indexes of lat=8, lon=12 (not sure where those are going to be:

exper_index = 1
lat_index = 8
lon_index = 12
# ':' below means "full slice"--take everything along that dimension
plt.plot(u[:, exper_index, lat_index, lon_index], time)
plt.title(f'U at latitude {lat[lat_index]}, longitude {lon[lon_index]}')
plt.show()

Upvotes: 1

Related Questions