Plot Polar Gridded Sea Ice Concentrations using Cartopy

Question:

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

Asked By: xue1527

||

Answers:

When I downloaded the data I found the grid specifications:

  • Upper Left Corner X Coordinate: -3850000.0
  • Upper Left Corner Y Coordinate: 5850000.0
  • Lower Right Corner X Coordinate: 3750000.0
  • Lower Right Corner Y Coordinate: -5350000.0

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

Answered By: ocefpaf

I know that this question is 7 years old at this point, but I recently ran into the exact same issue and couldn’t find an answer. So hopefully this helps some other poor, frustrated grad student.

I ended up having to transform each point individually and then it successfully plotted with contourf, like this:

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

# lats and lons should be 2d grids
s = np.size(lats)
lats.flatten(); lons.flatten()
X = []; Y = []
for itr in range(len(lats)):
  x,y = ccrs.NorthPolarStereo().transform_point(lons[itr], lats[itr], ccrs.PlateCarree())
  X.append(x); Y.append(y)

X = np.reshape(X, (s[0], s[1])); Y = np.reshape(Y, (s[0], s[1]))

fig = plt.figure()
ax1 = plt.subplot(1,1,1, projection=ccrs.NorthPolarStereo())
ax1.set_extent([-180, 180, 45, 90], ccrs.PlateCarree())
ax1.contourf(X,Y,vals)
Answered By: Madeline Clark
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.