Ubuntu – Plotting with Matplotlib in Python 3 pylab: Tkinter and Qt FontManager errors

matplotlibpythonpython3qttkinter

I'm trying to use pylab (i.e., $ ipython3 --pylab) in Python 3 on Ubuntu 14.04. I'm running into the same error regardless of whether I use the Tkinter or Qt4 backends.

AttributeError: 'FontManager' object has no attribute 'ttf_lookup_cache'

This same basic plot routine (plt.plot([1,2,3,4])) works in the Python 2 pylab, however.

I've installed the necessary dependencies, to my knowledge (note, for both Python 2 and Python 3):

sudo apt-get install python-numpy python-scipy python-matplotlib
sudo apt-get install python3-numpy python3-scipy python3-matplotlib
sudo apt-get install python-tk python3-tk
sudo apt-get install libqt4gui libqt4core python-qt4 python3-qt4

Full tracebacks are available below. Here's with Tkinter:

$ ipython3 --matplotlib tk
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
Type "copyright", "credits" or "license" for more information.

IPython 1.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import matplotlib.pyplot as plt

In [2]: plt.plot([1,2,3,4])
Out[2]: [<matplotlib.lines.Line2D at 0x7f1496dc9c50>]

In [3]: Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.4/tkinter/__init__.py", line 1490, in __call__
    return self.func(*args)
  File "/usr/lib/python3.4/tkinter/__init__.py", line 535, in callit
    func(*args)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 363, in idle_draw
    self.draw()
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 348, in draw
    FigureCanvasAgg.draw(self)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_agg.py", line 451, in draw
    self.figure.draw(self.renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/artist.py", line 56, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/figure.py", line 1035, in draw
    func(*args)
  File "/usr/lib/python3/dist-packages/matplotlib/artist.py", line 56, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/axes.py", line 2088, in draw
    a.draw(renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/artist.py", line 56, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/axis.py", line 1094, in draw
    renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/axis.py", line 1043, in _get_tick_bboxes
    extent = tick.label1.get_window_extent(renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/text.py", line 755, in get_window_extent
    bbox, info, descent = self._get_layout(self._renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/text.py", line 321, in _get_layout
    ismath=False)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_agg.py", line 214, in get_text_width_height_descent
    font = self._get_agg_font(prop)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_agg.py", line 258, in _get_agg_font
    fname = findfont(prop)
  File "/usr/lib/python3/dist-packages/matplotlib/font_manager.py", line 1362, in findfont
    font = fontManager.findfont(prop, **kw)
  File "/usr/lib/python3/dist-packages/matplotlib/font_manager.py", line 1202, in findfont
    font_cache = self.ttf_lookup_cache
AttributeError: 'FontManager' object has no attribute 'ttf_lookup_cache'

And here's with Qt/Qt4:

$ ipython3 --matplotlib qt
WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
Type "copyright", "credits" or "license" for more information.

IPython 1.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import matplotlib.pyplot as plt

In [2]: plt.plot([1,2,3,4])
Out[2]: [<matplotlib.lines.Line2D at 0x7f0f840947f0>]

In [3]: Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_qt4.py", line 374, in idle_draw
    self.draw()
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_qt4agg.py", line 154, in draw
    FigureCanvasAgg.draw(self)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_agg.py", line 451, in draw
    self.figure.draw(self.renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/artist.py", line 56, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/figure.py", line 1035, in draw
    func(*args)
  File "/usr/lib/python3/dist-packages/matplotlib/artist.py", line 56, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/axes.py", line 2088, in draw
    a.draw(renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/artist.py", line 56, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/axis.py", line 1094, in draw
    renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/axis.py", line 1043, in _get_tick_bboxes
    extent = tick.label1.get_window_extent(renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/text.py", line 755, in get_window_extent
    bbox, info, descent = self._get_layout(self._renderer)
  File "/usr/lib/python3/dist-packages/matplotlib/text.py", line 321, in _get_layout
    ismath=False)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_agg.py", line 214, in get_text_width_height_descent
    font = self._get_agg_font(prop)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_agg.py", line 258, in _get_agg_font
    fname = findfont(prop)
  File "/usr/lib/python3/dist-packages/matplotlib/font_manager.py", line 1362, in findfont
    font = fontManager.findfont(prop, **kw)
  File "/usr/lib/python3/dist-packages/matplotlib/font_manager.py", line 1202, in findfont
    font_cache = self.ttf_lookup_cache
AttributeError: 'FontManager' object has no attribute 'ttf_lookup_cache'

If you suspect this is an IPython bug, please report it at:
    https://github.com/ipython/ipython/issues
or send an email to the mailing list at ipython-dev@scipy.org

You can print a more detailed traceback right now with "%tb", or use "%debug"
to interactively debug it.

Extra-detailed tracebacks for bug-reporting purposes can be enabled via:
    %config Application.verbose_crash=True

In both cases, the plot window appears. In the case of Tkinter, the plot is blank (empty) but with Qt4 I do see the correct result–And the error still fires. Again, this works fine with either backend in Python 2.7. What am I missing?

Best Answer

I was able to resolve this issue by removing my matplotlib font cache (both the Python 3 and Python 2 font caches), e.g.,

rm /home/arthur/.cache/matplotlib/fontList*.cache

I can now use any other following environment initializations without errors:

ipython3 --pylab
ipython3 --matplotlib tk
ipython3 --matplotlib qt4
Related Question