Hi all! I'm trying to plot some sea ice freeboard data (netCDF, Gridded total freeboard) on the Antarctic sea, but the data that should plot nicely around Antarctica lies at the bottom of my image. NetCDF and matplotlib are fairly new to me so I'm not quite sure, where the error could be and I feel like I've search and tried everything there is. <http://matplotlib.1069221.n5.nabble.com/file/n43580/bad_fb.png> from scipy.io.netcdf import netcdf_file as Dataset import numpy as np import matplotlib.pyplot as plt FB = Dataset('./datasets/fb-0217-0320.nc', 'r') f = FB.variables['f'][:,:] lat = FB.variables['lat'][:,0] lon = FB.variables['lon'][0,:] masked_fb = np.ma.masked_where(np.isnan(f), f) mtx_lon, mtx_lat = np.meshgrid(lon, lat) m = Basemap(projection='spstere',boundinglat=-50, lon_0=180., resolution='l') m.bluemarble() plt.figure() m.pcolormesh(mtx_lon, mtx_lat, masked_fb, latlon=True) plt.show() And ncdump gives: dimensions: x = 79 ; y = 83 ; variables: float lat(y, x) ; lat:standard_name = "latitude" ; lat:long_name = "latitude coordinate" ; lat:units = "degrees_north" ; float lon(y, x) ; lon:standard_name = "longitude" ; lon:long_name = "longitude coordinate" ; lon:units = "degrees_east" ; float f(y, x) ; f:long_name = "total_freeboard" ; f:units = "mm" ; f:coordinates = "lat lon" ; Could there be something funny with the projection or handling the data? (When using meshgrid, handling the coordinates like ['lat'][:,0] seems necessary, otherwise it turns lats and lons like (6557,6557) and gives error message for pcolormesh, since masked_fb is (83,79).) -- View this message in context: http://matplotlib.1069221.n5.nabble.com/Data-plotting-in-a-wrong-place-tp43580.html Sent from the matplotlib - users mailing list archive at Nabble.com.
don't know if this would make a difference, but meshgrid here is completely unnecessary given that the netcdf file has the lats and lons in 2 dimensions anyway. Given that this is a polar projection, I wouldn't be surprised if there is something wonky there. Are the longitudes and latitudes monotonic? Cheers! Ben Root On Thu, Jun 26, 2014 at 4:42 AM, billyi <bil...@ho...> wrote: > Hi all! I'm trying to plot some sea ice freeboard data (netCDF, Gridded > total > freeboard) on the Antarctic sea, but the data that should plot nicely > around > Antarctica lies at the bottom of my image. NetCDF and matplotlib are fairly > new to me so I'm not quite sure, where the error could be and I feel like > I've search and tried everything there is. > <http://matplotlib.1069221.n5.nabble.com/file/n43580/bad_fb.png> > > from scipy.io.netcdf import netcdf_file as Dataset > import numpy as np > import matplotlib.pyplot as plt > > FB = Dataset('./datasets/fb-0217-0320.nc', 'r') > f = FB.variables['f'][:,:] > lat = FB.variables['lat'][:,0] > lon = FB.variables['lon'][0,:] > masked_fb = np.ma.masked_where(np.isnan(f), f) > mtx_lon, mtx_lat = np.meshgrid(lon, lat) > m = Basemap(projection='spstere',boundinglat=-50, lon_0=180., > resolution='l') > m.bluemarble() > > plt.figure() > m.pcolormesh(mtx_lon, mtx_lat, masked_fb, latlon=True) > plt.show() > > And ncdump gives: > dimensions: > x = 79 ; > y = 83 ; > variables: > float lat(y, x) ; > lat:standard_name = "latitude" ; > lat:long_name = "latitude coordinate" ; > lat:units = "degrees_north" ; > float lon(y, x) ; > lon:standard_name = "longitude" ; > lon:long_name = "longitude coordinate" ; > lon:units = "degrees_east" ; > float f(y, x) ; > f:long_name = "total_freeboard" ; > f:units = "mm" ; > f:coordinates = "lat lon" ; > > Could there be something funny with the projection or handling the data? > (When using meshgrid, handling the coordinates like ['lat'][:,0] seems > necessary, otherwise it turns lats and lons like (6557,6557) and gives > error > message for pcolormesh, since masked_fb is (83,79).) > > > > -- > View this message in context: > http://matplotlib.1069221.n5.nabble.com/Data-plotting-in-a-wrong-place-tp43580.html > Sent from the matplotlib - users mailing list archive at Nabble.com. > > > ------------------------------------------------------------------------------ > Open source business process management suite built on Java and Eclipse > Turn processes into business applications with Bonita BPM Community Edition > Quickly connect people, data, and systems into organized workflows > Winner of BOSSIE, CODIE, OW2 and Gartner awards > http://p.sf.net/sfu/Bonitasoft > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users >
Oh my, it WAS the meshgrid! Thank you so much! When reading the coordinates like: lat = FB.variables['lat'][:,:] lon = FB.variables['lon'][:,:] And plotting (without meshgrid!): m.pcolormesh(lon, lat, masked_fb, latlon=True) it works! Now I feel stupid. And I think the longitudes and latitudes are not monotonic, but I don't know the way to check this, other than checking the array like lon[:] in terminal. Is there a better way? And thank you again! Bill Wang -- View this message in context: http://matplotlib.1069221.n5.nabble.com/Data-plotting-in-a-wrong-place-tp43580p43588.html Sent from the matplotlib - users mailing list archive at Nabble.com.
On 06/27/2014 02:14 AM, billyi wrote: > And I think the longitudes and latitudes are not monotonic, but I don't know > the way to check this, other than checking the array like lon[:] in > terminal. Is there a better way? numpy slicing (subtract prior from next element check that 'all' the results are >=0): In [1]: import numpy In [2]: x=numpy.array([1,2,3,4,5]) In [3]: (x[1:]-x[:-1])>=0 Out[3]: array([ True, True, True, True], dtype=bool) In [4]: numpy.all((x[1:]-x[:-1])>=0) Out[4]: True In [5]: x=numpy.array([1,3,2,5,4]) In [6]: numpy.all((x[1:]-x[:-1])>=0) Out[6]: False
On Thu, 2014年06月26日 at 23:14 -0700, billyi wrote: > Oh my, it WAS the meshgrid! Thank you so much! > When reading the coordinates like: > lat = FB.variables['lat'][:,:] > lon = FB.variables['lon'][:,:] > > And plotting (without meshgrid!): > m.pcolormesh(lon, lat, masked_fb, latlon=True) > > it works! Now I feel stupid. > And I think the longitudes and latitudes are not monotonic, but I don't know > the way to check this, other than checking the array like lon[:] in > terminal. Is there a better way? Yes. Consider: py> all(lon[:-1] <= lon[1:]) If True, then lon is monotonically increasing. Otherwise it's not. Description: lon[:-1] is a slice that takes every element of lon except the last one. lon[1:] is a slice that takes every element of lon except the first one. The comparison operator will create a bool numpy array whose elements will be True for each element "i" if the i'th element is less than or equal to the i+1'th element. Applying the "all" (or numpy.all) functions to this bool array will return True if every element is true and False otherwise. Faster, easier, and less error-prone than printing out the array and checking it yourself. Of course you could do something more explicit: py> monotonic = True py> for i in range(len(lon)-1): py> if lon[i] > lon[i+1]: py> monotonic = False py> break HTH, Jason
actually, that is technically incorrect. That only works for monotonically increasing series, but not monotonically decreasing series. diffs = np.diff(lon) if np.all(diffs <= 0): return True if np.all(diffs >= 0): return True return False provided that len(lon) >= 2, obviously (and it doesn't work right for 2 or more dimensions). Ben Root On Fri, Jun 27, 2014 at 10:03 AM, Jason Swails <jas...@gm...> wrote: > On Thu, 2014年06月26日 at 23:14 -0700, billyi wrote: > > Oh my, it WAS the meshgrid! Thank you so much! > > When reading the coordinates like: > > lat = FB.variables['lat'][:,:] > > lon = FB.variables['lon'][:,:] > > > > And plotting (without meshgrid!): > > m.pcolormesh(lon, lat, masked_fb, latlon=True) > > > > it works! Now I feel stupid. > > And I think the longitudes and latitudes are not monotonic, but I don't > know > > the way to check this, other than checking the array like lon[:] in > > terminal. Is there a better way? > > Yes. Consider: > > py> all(lon[:-1] <= lon[1:]) > > If True, then lon is monotonically increasing. Otherwise it's not. > > Description: > > lon[:-1] is a slice that takes every element of lon except the last one. > lon[1:] is a slice that takes every element of lon except the first one. > The comparison operator will create a bool numpy array whose elements > will be True for each element "i" if the i'th element is less than or > equal to the i+1'th element. Applying the "all" (or numpy.all) > functions to this bool array will return True if every element is true > and False otherwise. > > Faster, easier, and less error-prone than printing out the array and > checking it yourself. Of course you could do something more explicit: > > py> monotonic = True > py> for i in range(len(lon)-1): > py> if lon[i] > lon[i+1]: > py> monotonic = False > py> break > > HTH, > Jason > > > > ------------------------------------------------------------------------------ > Open source business process management suite built on Java and Eclipse > Turn processes into business applications with Bonita BPM Community Edition > Quickly connect people, data, and systems into organized workflows > Winner of BOSSIE, CODIE, OW2 and Gartner awards > http://p.sf.net/sfu/Bonitasoft > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users >