pythonicecartopy

Plot Polar Gridded Sea Ice Concentrations using Cartopy


I am trying to make some plots of Polar Gridded Sea Ice Concentrations from NSIDC. The data is delivered in the Polar Stereographic Projection and Grid, an example file (binary,Arctic,25 km resolution) can be downloaded at: http://nsidc.org/data/NSIDC-0081

When I read the data using numpy, and then plot it just using matplotlib's imshow function, it works.

import numpy as np
import matplotlib.pyplot as plt

infile='c:\\nt_20150326_f17_nrt_n.bin'
fr=open(infile,'rb')
hdr=fr.read(300)
ice=np.fromfile(fr,dtype=np.uint8)
ice=ice.reshape(448,304)
#Convert to the fractional parameter range of 0.0 to 1.0
ice = ice/250.
#mask all land and missing values
ice=np.ma.masked_greater(ice,1.0)
fr.close()
#Show ice concentration
plt.imshow(ice)

When I try to plot it using Cartopy, it runs without any errors but only returns an empty coastline.

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

fig=plt.figure(figsize=(3, 3))
ax = plt.axes(projection=ccrs.NorthPolarStereo())
ax.coastlines(resolution='110m',linewidth=0.5)
ax.set_extent([-180,180,50,90],crs=ccrs.PlateCarree())
ax.gridlines()
#set ice extent from Polar Stereographic Projection and Grid document
extent=[-9.97,168.35,30.98,34.35]
ax.imshow(ice,cmap=plt.cm.Blues, vmin=1,vmax=100,
          extent=extent,transform=ccrs.PlateCarree())

Anything wrong? How do I show my ice concentration data?

My Cartopy's version is 0.12.0rc1.

Below is the Arctic Polar Stereographic Grid from document:

Northern Hemisphere Grid Coordinates

X (km)  Y (km)  Latitude (deg)  Longitude (deg)
-3850   5850    30.98   168.35  corner
3750    5850    31.37   102.34  corner
3750    -5350   34.35   350.03  corner
-3850   -5350   33.92   279.26  corner

Here is the IPython Notebook: http://nbviewer.ipython.org/github/xue1527/MyWork/blob/master/Plot%20Arctic%20Sea%20Ice%20Concentration.ipynb


Solution

  • When I downloaded the data I found the grid specifications:

    With that you can create a grid and use pcolormesh instead of imshow.

    import numpy as np
    dx = dy = 25000
    x = np.arange(-3850000, +3750000, +dx)
    y = np.arange(+5850000, -5350000, -dy)
    

    Here is the full notebook: http://nbviewer.ipython.org/gist/ocefpaf/47ef0c38a5a429704170