6

Recently, my code involving matplotlib.pyplot suddenly stopped working on all my machines (Ubuntu 22.04 LTS). I tried a simple import and got the following error:

$ python
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.pyplot as plt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.10/dist-packages/matplotlib/pyplot.py", line 66, in <module>
    from matplotlib.figure import Figure, FigureBase, figaspect
  File "/usr/local/lib/python3.10/dist-packages/matplotlib/figure.py", line 43, in <module>
    from matplotlib import _blocking_input, backend_bases, _docstring, projections
  File "/usr/local/lib/python3.10/dist-packages/matplotlib/projections/__init__.py", line 58, in <module>
    from mpl_toolkits.mplot3d import Axes3D
  File "/usr/lib/python3/dist-packages/mpl_toolkits/mplot3d/__init__.py", line 1, in <module>
    from .axes3d import Axes3D
  File "/usr/lib/python3/dist-packages/mpl_toolkits/mplot3d/axes3d.py", line 23, in <module>
    from matplotlib import _api, cbook, docstring, _preprocess_data
ImportError: cannot import name 'docstring' from 'matplotlib' (/usr/local/lib/python3.10/dist-packages/matplotlib/__init__.py)

I am not sure what caused the problem, and how to diagnose or fix it. The matplotlib package is installed using pip as root, as I need it to be available to all users by default.

Has anyone encountered a similar issue and know how to fix it?

0

2 Answers 2

12

As pointed out in comments by @Imsteffan, and the linked bug reports here and here, the issue happens because:

... docstring was removed after a deprecation cycle of 2 releases and changed to be private (_docstring)

However, the line that is erroring in mplot3d/axes3d.py was updated #22148, indicating that you have a version of mpl that it is picking up that is <3.6

This is the case in my OS. It turns out that the apt package python3-matplotlib is also installed as the dependency of another package (qgis). So there are two versions of matplotlib, from pip and from apt, respectively.

The solution is to remove one of the two versions.

In the linked bug report, the suggestion is to remove the apt version:

sudo apt remove python3-matplotlib

But in my case, I can't remove the application that depends on the apt version. So I removed the pip version instead. And then the import works as expected.

$ sudo pip uninstall matplotlib
Found existing installation: matplotlib 3.8.0
Uninstalling matplotlib-3.8.0:
  Would remove:
    /usr/local/lib/python3.10/dist-packages/matplotlib-3.8.0.dist-info/*
    /usr/local/lib/python3.10/dist-packages/matplotlib/*
    /usr/local/lib/python3.10/dist-packages/mpl_toolkits/axes_grid1/*
    /usr/local/lib/python3.10/dist-packages/mpl_toolkits/axisartist/*
    /usr/local/lib/python3.10/dist-packages/mpl_toolkits/mplot3d/*
    /usr/local/lib/python3.10/dist-packages/pylab.py
Proceed (Y/n)? 
  Successfully uninstalled matplotlib-3.8.0
Sign up to request clarification or add additional context in comments.

Comments

0

Currently, EnMapBox is installed from an environment (see https://enmap-box.readthedocs.io/en/latest/usr_section/usr_installation.html#option-a-install-qgis-via-the-official-repository)

, and I find the following problem when trying your fix:

(base) alobo@pop-os:~$ source ~/.virtualenvs/enmapbox/bin/activate
(enmapbox) (base) alobo@pop-os:~$ sudo pip uninstall matplotlib
Found existing installation: matplotlib 3.5.1
Not uninstalling matplotlib at /usr/lib/python3/dist-packages, outside environment /usr
Can't uninstall 'matplotlib'. No files were found to uninstall.
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.