matplotlib / matplotlib/basemap

contourf on cylindrical projection with irregular latlon grid (tri=True) is calling shiftdata when it shouldn't

Open
#492 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
817
Forks
395
PR merge metrics
No merged PRs in 30d

Description

I ran into this problem while trying to plot interpolated data NOT on a regular latlon grid. Orthographic projection works but cylindrical does not.

Relevant code:

fig = plt.figure()
ax = fig.add_subplot(111)
levels = 20
m = Basemap(projection="cyl") # causes ValueError
# m = Basemap(projection="ortho", lat_0=0., lon_0=0., resolution='l') # works, does not cause ValueError
MC = m.contourf(lons_deg, lats_deg, vals, levels, ax=ax, tri=True, latlon=True) # latlon=True interprets first two args as lon and lat respectively

Note that `lats_deg`, `lons_deg`, and `vals` are 1d np arrays with irregular point spacing (no meshgrid). I used `tri=True` to allow interpolation. This works fine on orthographic projection. But with cylindrical I get the following error:

Traceback (most recent call last):
File "IcosahedralGeodesicLattice.py", line 146, in
test_lattice.plot_data(data)
File "/home/wesley/programming/Mapping/Lattice.py", line 86, in plot_data
MC = m.contourf(lons_deg, lats_deg, vals, levels, ax=ax, tri=True, latlon=True) # latlon=True interprets first two args as LON and LAT RESPECTIVELY
File "/home/wesley/.local/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 544, in with_transform
fix_wrap_around=plotfunc.__name__ not in ["scatter"])
File "/home/wesley/.local/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 4797, in shiftdata
if fix_wrap_around and itemindex:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Looking at [the relevant file](https://github.com/matplotlib/basemap/blob/master/lib/mpl_toolkits/basemap/__init__.py), the docstring for `shiftdata` says "Only valid for cylindrical/pseudo-cylindrical global projections and data on regular lat/lon grids. longitudes and data can be 1-d or 2-d, if 2-d it is assumed longitudes are 2nd (rightmost) dimension."

So should it not be being called with `tri=True`? Sorry if I have misunderstood something, let me know. Thanks!

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in lib/mpl_toolkits/basemap/__init__.py, following the contourf wrapper into shiftdata and the itemindex check shown in the traceback. Reproduce the example with a cylindrical projection, irregular 1D arrays, tri=True, and latlon=True, then compare it with orthographic projection; done means the cylindrical case no longer raises the ambiguous-array ValueError while regular-grid behavior remains intact.

Written by the indexing model from the issue text.

Assessment

Tech stack
matplotlib, python
Domain
data-visualization
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.