IndexError with Basemap.contour() when using certain projections

basemap contourf python
basemap contourf color
basemap cm
fig ax basemap
python basemap inset
python basemap coordinates
basemap tutorial
basemap readshapefile

I have run into problems when using Basemap.contour with certain projections. Based on the example given in the Basemap documentation, I created the following working code which produces the expected result. The example uses the 'tmerc' projection.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np


m2 = Basemap(projection='tmerc', 
              lat_0=0, lon_0=3,
              llcrnrlon=1.819757266426611, 
              llcrnrlat=41.583851612359275, 
              urcrnrlon=1.841589961763497, 
              urcrnrlat=41.598674173123)
##m2 = Basemap(projection='kav7',lon_0=0)

x = np.linspace(0, m2.urcrnrx, 100)
y = np.linspace(0, m2.urcrnry, 100)
xx, yy = np.meshgrid(x, y)
data = np.sin(xx/100)*np.cos(yy/100)

levels = np.linspace(-1,1,8)
m2.contour(xx, yy, data, levels)

plt.show()

However, if I switch to using the 'kav7' projection in the alternative m2=Basemap declaration (commented out in the example code), the code fails with the following error:

Traceback (most recent call last):
  File "basemap_contour.py", line 20, in <module>
    m2.contour(xx, yy, data, levels)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 521, in with_transform
    return plotfunc(self,x,y,data,*args,**kwargs)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 3542, in contour
    xx = x[x.shape[0]/2,:]
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Note that this also happens when I define lon and lat values 'properly', the example was only chosen to be as short as possible. Does anybody know how to resolve this?

EDIT:

In case this is relevant, I'm using python version 3.5.3 on an osx Sierra machine. The matplotlib version is 2.0.0 and the basemap version is 1.0.7 .

This bug has been fixed 2 years ago and does not occur in any basemap version >=1.1.0, independent of the use of python 2 or 3.

python, Instead of calling Basemap.contour , one can call contour directly on the np fig,​ax = plt.subplots() m2 = Basemap(projection='kav7',lon_0=0,  Other fields give information about the used projection. proj4string A string that can be used with proj4 (or GDAL) to have the used projection definition; projection The code of the used projection, as indicated in the projection argument; projparams A dict with the projection parameters. The ones passed and the ones put by default by Basemap

This behavior is according to python3 integer division. Look for examples:

1) python3:

n=100
print (n/2, (n+1)/2)

Output: 50.0 50.5

2) For python 2.7 this code returns 50 50

Solutions:

1) manually update contour and contourf function of basemap with division for python3.

You have to write for integer n: n//2 which is apply division from python2.

2) or run your program with python2.

Basemap utility functions, ReadAsArray() x = linspace(0, map.urcrnrx, data.shape[1]) y = linspace(0, map.​urcrnry, A colormesh and a contour fields are plotted, to be able to use some advanced The projection cyl (lat/lon), which is the default, can't use this method​. basemap by matplotlib - Commit Score: This score is calculated by counting number of weeks with non-zero commits in the last 1 year period. So if 26 weeks out of the last 52 had non-zero commits and the rest had zero commits, the score would be 50%.

I found a really simple workaround to this problem. Instead of calling Basemap.contour, one can call contour directly on the Axes instance of the Basemap:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

fig,ax = plt.subplots()
m2 = Basemap(projection='kav7',lon_0=0, ax=ax)

x = np.linspace(0, m2.urcrnrx, 100)
y = np.linspace(0, m2.urcrnry, 100)

xx, yy = np.meshgrid(x, y)
lon,lat = m2(xx,yy, inverse = True)

data = np.sin(np.pi*lon/180)*np.cos(np.pi*lat/90)
m2.drawcoastlines(linewidth=0.5)

levels = np.linspace(-1,1,8)
##m2.contour(xx, yy, data, levels)
ax.contour(xx,yy,data,levels)
plt.show()

This produces the following picture both under Python 2.7 and 3.6:

basemap/__init__.py at master · matplotlib/basemap · GitHub, When I try to use a contourf with basemap, with projection 'cyl', such as: from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy  Setting up the map¶ In order to represent the curved surface of the earth on a two-dimensional map, a map projection is needed. Since this cannot be done without distortion, there are many map projections, each with it’s own advantages and disadvantages. Basemap provides 24 different map projections.

#869156, Contribute to matplotlib/basemap development by creating an account on basemap/lib/mpl_toolkits/basemap/__init__.py projection specific parameters. axis (a) and the inverse flattening parameter using make filled contour plot. m.drawmapboundary() # draw a line around the map region. > an IndexError. Using  This mean that when the original values come from a different projection, the data matrix must be re-projected, and the x and y matrices re-calculated, as you can see in the example. To calculate an evenly spaced grid, the method makegrid can be used. It’s better to use the returnxy=True attribute to get the grid in the map projection units.

matplotlib / Re: [Matplotlib-users] IndexError' too many indices' in , Package: python3-mpltoolkits.basemap; Maintainer for Maintainer, When using the "contourf" function, some map-projections (e.g. 'mill') fail with the following error condition: IndexError: only integers, slices (`:`), ellipsis (`. Basemap 버전 1.0.7, matplotlib 2.0.2가있는 Ubuntu 16.4에서 Python 3.6.1 64 비트, Qt 5.6.2, PyQt5 5.6을 사용하고 있습니다. 나는 같은 투사 'CYL'로, 베이스 맵와 contourf를 사용하려고하면 : from mpl_toolkits.basemap import Basemap import matplotlib.pyplot

fatiando.vis.mpl, I try to plot some interpolated data on a map and get an error saying > there are too many indices. When I use contour in matplotlib without > basemap I don't get the error. zi = griddata(lon,lat,var,xi,yi) > > map = Basemap(projection='cyl', llcrnrlat=67, map.drawcoastlines() > > map.drawmeridians(np.arange(0,360,1)) >  Parameters: X, Y array-like, optional. The coordinates of the values in Z.. X and Y must both be 2-D with the same shape as Z (e.g. created via numpy.meshgrid), or they must both be 1-D such that len(X) == M is the number of columns in Z and len(Y) == N is the number of rows in Z.

Comments
  • I cannot reproduce this error, running the code with Basemap(projection='kav7',lon_0=0) produces this image for me.
  • @ImportanceOfBeingErnest I see. Could this be an implementation problem? I'm on osx and all the relevant packages are installed with macports.
  • I have no idea. The error seems to come from within basemap. I have version 1.1.0.
  • I edited the question to give some version details.
  • I just checked, you are right. However, given the dates when I asked and answered the question, respectively, the problem was still valid about half a year ago. I'm guessing that, even though a bug is fixed in the code, it takes some time before the corrections find their way to all package managers...