# [Matplotlib-users] plotting netcdf data on a map in matplotlib

Ryan May rmay31 at gmail.com
Thu Mar 30 17:36:36 EDT 2017

```Here's a version that works for me with cartopy. It relies on np.roll(),
which just got added in numpy 1.12, to correct the fact that the longitudes
are arranged 180-360, 0-180, which seems to be causing problems. The other
easy way to solve that is to plot the data in chunks.

import cartopy.crs as ccrs
import cartopy.feature as cfeat
import matplotlib.pyplot as plt
from netCDF4 import Dataset
import numpy as np

fh = Dataset(ncfile)

lats = fh.variables['latitude'][:]
lons = fh.variables['longitude'][:]
HTSGW_var = fh.variables['HTSGW_surface']

roll_to = -lons.argmin()
lons = np.roll(lons, roll_to)
data = np.roll(HTSGW_var[:].squeeze(), roll_to, axis=-1)

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
ax.set_global()
lon, lat = np.meshgrid(lons, lats)
cs = ax.pcolor(lon, lat, data)
# If roll not available
#cs = ax.pcolor(lon[:, :180], lat[:, :180], data[:, :180])
#cs = ax.pcolor(lon[:, 180:], lat[:, 180:], data[:, 180:])

# draw coastlines.
ax.coastlines()
plt.show()

On Thu, Mar 30, 2017 at 2:49 PM, Jason Snyder <jmssnyder at ucdavis.edu> wrote:

> The main issue I have is that the data does not plot properly.  There
> evidently is an issue of matching coordinates in the data versus the map.
> I am sending the netcdf file along with the script.  I am not sure how to
> plot a map with data without using basemap since this is what provides the
> continental outlines.  If you know of any way I can plot this data using
> matplotlib successful let me know.
>
> -Jason
>
>
>
> On Thu, Mar 30, 2017 at 8:38 PM, Jody Klymak <jklymak at uvic.ca> wrote:
>
>> I’m not an expert on cartopy.
>>
>> 1) can you plot this data w/o using basemap?
>> 2) why do you have the “squeeze” command in there?
>> 3) I’m not clear what the problem is with your image from the snippet you
>> sent.   Is it just an issue with the longitude wrapping?  Some projections
>> demand longitude must be between -180 and 180. i.e.
>> lon[lon>=180]=lon[lon>=180]-360.  You may also need to re-order your
>> longitude and data so that longitude is monotonically increasing.
>> 4) I recommend xarray when dealing w/ netcdf files, though maybe that is
>>
>> A minimal working example with a link to the bad data always helps.
>>
>> I’m sure with a bit of experimentation and use of google you can get this
>> working.
>>
>> i.e.
>> http://stackoverflow.com/questions/13856123/setting-up-a-
>> map-which-crosses-the-dateline-in-cartopy
>>
>> Cheers,   Jody
>>
>>
>>
>>
>>
>
>
> --
> Jason Snyder PhD
>
>
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users at python.org
> https://mail.python.org/mailman/listinfo/matplotlib-users
>
>

--
Ryan May
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20170330/2556d05e/attachment.html>
```