basemap: AttributeError: can't set attribute ax._hold = self._tmp_hold

Bug report

Bug summary

Basemap cannot work when I update the matplotlib to the new version 3.0.1.

Code for reproduction

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

outfile = r'E:\wrong.tif'

# read in data on lat/lon grid.
# data from https://github.com/matplotlib/basemap/tree/master/examples
hgt = np.loadtxt(r'E:\tmp\basemap\500hgtdata.gz')
lons = np.loadtxt(r'E:\tmp\basemap\500hgtlons.gz')
lats = np.loadtxt(r'E:\tmp\basemap\500hgtlats.gz')
lons, lats = np.meshgrid(lons, lats)

mnh = Basemap(lon_0=-105, boundinglat=20.,
              resolution='c', area_thresh=10000., projection='nplaea')
xnh, ynh = mnh(lons, lats)
CS = mnh.contour(xnh, ynh, hgt, 15, linewidths=0.5, colors='k')
CS = mnh.contourf(xnh, ynh, hgt, 15, cmap=plt.cm.Spectral)

mnh.drawcoastlines(linewidth=0.5)
delat = 30.
circles = np.arange(0., 90., delat).tolist() + \
          np.arange(-delat, -90, -delat).tolist()
mnh.drawparallels(circles, labels=[1, 0, 0, 0])
delon = 45.
meridians = np.arange(0, 360, delon)
mnh.drawmeridians(meridians, labels=[1, 0, 0, 1])
plt.title('NH 500 hPa Height (cm.Spectral)')

# colorbar on bottom.
mnh.colorbar(pad='5%')
plt.savefig(outfile, dpi=300, bbox_inches='tight')  
plt.show()

Actual outcome

# If applicable, paste the console output here

Traceback (most recent call last):
  File "E:/MyWork/code/python/psta/tmp.py", line 20, in <module>
    CS = mnh.contour(xnh, ynh, hgt, 15, linewidths=0.5, colors='k')
  File "D:\Python36\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 542, in with_transform
    return plotfunc(self,x,y,data,*args,**kwargs)
  File "D:\Python36\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 3566, in contour
    self._restore_hold(ax)
  File "D:\Python36\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 3229, in _restore_hold
    ax._hold = self._tmp_hold
AttributeError: can't set attribute

Expected outcome

Matplotlib version

  • Operating system: Windows 10 x64
  • Matplotlib version: 3.0.1
  • Matplotlib backend (print(matplotlib.get_backend())): module://backend_interagg
  • Python version: 3.6.6
  • Jupyter version (if applicable): None
  • basemap version: 1.2.0
  • PyCharm version: 2018.2.4

I install matplotlib and basemap from https://www.lfd.uci.edu/~gohlke/pythonlibs.

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 3
  • Comments: 17 (9 by maintainers)

Commits related to this issue

Most upvoted comments

I have to say that python has a bad reputation with these ill-managed packages - that is probably the shortcomings of anaconda - R studio never had these issues. I hope python will gradually die and give in to R

@jamessong: I have to say that python has a bad reputation with these ill-managed packages - that is probably the shortcomings of anaconda - R studio never had these issues. I hope python will gradually die and give in to R

@WeatherGod I am so very jealous of your unfathomable patience and composure. Even simply considering to answer to something like this is rather heroic.

@jamessong I would not wish being responsible for giving customer support to you on whatever matter on my worst enemies. The problem and workaround is described very concise in the very last post (at the time of your first post) and yet you decide to come up with a post brimming with misconceptions and rude accusations towards the people that put their spare time into maintaining awesome projects like matplotlib, basemap or Anaconda (through conda-forge). I am so very, very glad I don’t understand your mindset. Please just stop using Python if you think it’s a bad thing and stop molesting people that make Python great, won’t you?

Same here and after I updated matplotlib 3.0.1 to 3.0.2, the problem was solved.

@jamessong, as I have noted, this issue is specifically the combination of matplotlib v3.0.1 and basemap v1.1.x. This is not a packaging issue. Matplotlib partly introduced a compatibility shim after a feature was removed in v3.0.0 that broke cartopy. That compatibility shim broke basemap. The matplotlib v3.0.2 fixes everything, which is why this issue is now closed.