FigureCanvasAgg interactivity problem

Hello, I recently reinstalled VSCode on my windows machine, and even when using identical code with the exact same matplotlib install it was throwing errors at me. The code was just a test script i wrote to try and see where the problem might be but I didn’t really get anywhere:

import matplotlib.pyplot as plt
import numpy as np

xpoints = np.random.randint(250, size=100)
ypoints = np.random.randint(250, size=100)

colour = (xpoints/xpoints.max())*50+(ypoints/ypoints.max())*50

plt.ion()
plt.plot([0,100],[100,0])
plt.scatter(xpoints, ypoints, c = colour, cmap = ‘viridis’)
plt.show()

The error it then threw at me was:

C:\Users*Username*\Documents\VSCode\test.py:12: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown
plt.show()

I had the same warning on Ubuntu 22.04. Installing pyqt5 worked for me.

python -m pip install PyQt5

Hope this helps

3 Likes

Did not work for me, I have the same error

1 Like

It’s worked!! Thanks! I had this warning on windows vscode.

Future Person™ here - installing PyQt6 worked for me. Thanks!

2 Likes

installing PyQt6 worked for me on Ubuntu 24.04.1 LTS. PyQt5 did not work. I imagine it’s the same problem as in 2023 but one version advanced.

I am trying to show a matplotlib.pyplot figure on Python 3.10 but can’t. I am aware of this question and tried their answers but is still unsuccessful. The default OS distribution is Ubuntu 24.04 using Python 3.12 as a default.

Here is how I setup the Python 3.10 project venv and installed numpy and matplotlib:

$ uv init test_py310 --python 3.10 
Initialized project `test-py310` at `/home/user/test_py310`
$ cd test_py310/
$ uv add numpy matplotlib
Using CPython 3.10.16
Creating virtual environment at: .venv
Resolved 12 packages in 136ms
Prepared 1 package in 1.96s
Installed 11 packages in 43ms
 + contourpy==1.3.2
 + cycler==0.12.1
 + fonttools==4.57.0
 + kiwisolver==1.4.8
 + matplotlib==3.10.1
 + numpy==2.2.5
 + packaging==25.0
 + pillow==11.2.1
 + pyparsing==3.2.3
 + python-dateutil==2.9.0.post0
 + six==1.17.0

test_matplotlib.py:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, label='sin(x)', color='blue', linestyle='--')
plt.show()

Error:

/home/user/Coding/test_py310/.venv/bin/python /home/user/test_py310/test_matplotlib,py 
/home/user/test_py310/test_matplotlib,py:7: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown
  plt.show()

Next, I tried installing PyQt5 as shared by this answer but still encountered error.

$ uv add pyqt5
Resolved 15 packages in 89ms
Installed 3 packages in 45ms
 + pyqt5==5.15.11
 + pyqt5-qt5==5.15.16
 + pyqt5-sip==12.17.0

Running the same python script

$ /home/user/test_py310/.venv/bin/python /home/user/test_py310/test_matplotlib,py
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted (core dumped)

Changing import matplotlib.pyplot as plt to:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

Gave this error:

$ /home/user/test_py310/.venv/bin/python /home/user/test_py310/test_matplotlib,py
AttributeError: module '_tkinter' has no attribute '__file__'. Did you mean: '__name__'?

The above exception was the direct cause of the following exception:

ImportError: failed to load tkinter functions

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/user/test_py310/test_matplotlib,py", line 9, in <module>
    plt.plot(x, y, label='sin(x)', color='blue', linestyle='--')
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/pyplot.py", line 3827, in plot
    return gca().plot(
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/pyplot.py", line 2774, in gca
    return gcf().gca()
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/pyplot.py", line 1108, in gcf
    return figure()
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/pyplot.py", line 1042, in figure
    manager = new_figure_manager(
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/pyplot.py", line 551, in new_figure_manager
    _warn_if_gui_out_of_main_thread()
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/pyplot.py", line 528, in _warn_if_gui_out_of_main_thread
    canvas_class = cast(type[FigureCanvasBase], _get_backend_mod().FigureCanvas)
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/pyplot.py", line 369, in _get_backend_mod
    switch_backend(rcParams._get("backend"))
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/pyplot.py", line 425, in switch_backend
    module = backend_registry.load_backend_module(newbackend)
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/backends/registry.py", line 317, in load_backend_module
    return importlib.import_module(module_name)
  File "/home/user/.local/share/uv/python/cpython-3.10.16-linux-x86_64-gnu/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/backends/backend_tkagg.py", line 1, in <module>
    from . import _backend_tk
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/backends/_backend_tk.py", line 25, in <module>
    from . import _tkagg
ImportError: initialization failed

Using

import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt

gave

$ /home/user/test_py310/.venv/bin/python /home/user/test_py310/test_matplotlib,py
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted (core dumped)

I have also removed pyqt5 and added pyqt6, and used matplotlib.use('Qt6Agg') but got this error:

$ /home/user/test_py310/.venv/bin/python /home/user/test_py310/test_matplotlib,py
Traceback (most recent call last):
  File "/home/user/test_py310/test_matplotlib,py", line 4, in <module>
    matplotlib.use('Qt6Agg')
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/__init__.py", line 1265, in use
    name = rcsetup.validate_backend(backend)
  File "/home/user/test_py310/.venv/lib/python3.10/site-packages/matplotlib/rcsetup.py", line 278, in validate_backend
    raise ValueError(msg)
ValueError: 'Qt6Agg' is not a valid value for backend; supported values are ['gtk3agg', 'gtk3cairo', 'gtk4agg', 'gtk4cairo', 'macosx', 'nbagg', 'notebook', 'qtagg', 'qtcairo', 'qt5agg', 'qt5cairo', 'tkagg', 'tkcairo', 'webagg', 'wx', 'wxagg', 'wxcairo', 'agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']

What must I do to be able to plot a matplotlib.pyplot figure in a virtual environment that is installed with Python 3.10? Just to add, I am able show a matplotlib.pyplot figure in a separate virtual environment using Python 3.12.

The Python provided by uv does not contain a compatible Tk library; see the Warning in the uv section of Install. The recommended (at least on that page) alternative backend is Qt6 with pyside6.

Note, there is no Qt6Agg backed; it is called QtAgg (and works for any Qt version).

Hello! I, too, had the same problem.
Using Ubuntu 24.04 with system Python 3.12 and trying to use matplotlib.pyplot.show() within a virtual environment in Python 3.10. I installed python3.10-tk onto my machine with
sudo apt install python3.10-tk
and afterwards forced matplotlib from within my program to use TkAgg just as you did, like
import matplotlib
matplotlib.use("TkAgg")
print(matplotlib.get_backend())
import matplotlib.pyplot as plt
The print() here outputs TkAgg as to check matplotlib now really uses Tkinter.
Now the program normally creates interactive matplotlib plots (for me).