IndexError with Basemap.contour() when using certain projections
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...