Matplotlib cannot switch backend to 'TkAgg', as 'qt' is currently running - python

I am trying to display a plot in Pycharm Comunity Edition and I get the following error:
UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so >cannot show the figure.
I have installed and imported tkinter before importing matplotlib but I cannot make Matplotlib switch to 'TKAgg'.
I tried running
matplotlib.use('TKAgg', force=True)
and
plt.switch_backend('tkagg')
and they both result in the following error:
ImportError: Cannot load backend 'TkAgg' which requires the 'tk' interactive >framework, as 'qt' is currently running
I also tried adding MPLBACKEND=TkAgg to the environment variables but did not change anything.
Does anyone have an idea what else I can do to solve this so that I can display graphs?

I had the same issue, and I somehow got it to work by putting the
matplotlib.use("TkAgg")
statement at the end of my module imports.
Essentially, the call to TkAgg was the last thing prior to the code. Not sure how it worked, but it worked for me. I think another module I was originally importing after the TkAgg statement was the issue.
I have tried putting the TkAgg statement back early in the module imports, and the issue comes back. When it is the last thing listed before my code starts, it works fine.

Related

Matplotlib has a problem finding a backend after I use pyinstaller

I'm trying to make an .exe file from .py and I'm having an issue with matplotlib library. When I run my script in VS Code plt.show() works just fine. But when I use pyinstaller to make an .exe and run the .exe file, it gives me a following warning: "UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure." Importing TkAgg directly with "import matplotlib.backends.backend_tkagg" doesn't solve the problem either.
Is it possible to fix that?
I ran into the same issue.
I found this article, which may be helpful:
"UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure." when plotting figure with pyplot on Pycharm
However, the simple fix in my case was to just explicitly import the backend module(s):
import matplotlib.backends.backend_tkagg
import matplotlib.backends.backend_wxagg
Pyinstaller does some relatively sophisticated analysis and Matplotlib itself has some relatively sophisticated code to be able to use multiple GUI backends. I think the overall problem is that Pyinstaller isn't seeing that any particular backend is actually being used and so doesn't end up bundling any backend module.
Explicitly making the import makes it obvious to Pyinstaller that you want that module (importing it is effectively using it). (Maybe you only need the one for 'tkagg' - I happen to be working with a WX GUI, so I included both imports - it works.)

Matplotlib does not show plot in PyCharm on Mac

I am using PyCharm on my MacBook to code and now I wanted to make a simple plot. When I run the file via the usual 'Run' command (do not know what it is called), it nicely shows my plots, but when I run the file in the Python console (which I find more convenient because you can access your variables) it does not show anything. On the other hand, when I just type it in the Python console afterwards, it does work.
I have read some things about backends and other 'solutions' as I am apparently not the only one with this issue. Mine says macosx and gives the command: "Backend MacOSX is interactive backend. Turning interactive mode on." after running the file in the Python console. I tried changing the backend:
import matplotlib
# matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
but that does not work (no plot pops up). And yes, I use plt.show() after my plotting section :)
I also tried with 'QtAgg' but then I get: "ImportError: Failed to import any qt binding"
Now I am completely new to this backends stuff (I think it has to do with this), so I could really use some clear directions on how I can solve this issue.
Thanks in advance!
I am not sure we can solve this bug with some adjustment. I think you need to fresh start. I suggest you to start a new clean venv and install a new matplotlib there.

Exe generated by PyInstaller fails quietly on a different machine

I'm having trouble getting an exe generated by PyInstaller on one PC (PC-Good) working on another (PC-Bad).
The exe is created on PC-Good, and executes as expected on PC-Good
Both PCs are running Windows 10
Issue occurs on PC-Bad upon calling most of the matplotlib.pyplot methods (such as subplots() or plot())
Issue persists even when matplotlib is in non-interactive mode
No error is reported upon failure. exe simply exits
even when matplotlib verbosity is changed to 'debug'
even when the problem statement is captured in try-exception
See below for code:
print('Start')
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
print("Import of matplotlib & pyplot successful")
plt.set_loglevel("debug")
x = [0, 1, 2, 3, 4]
y = [4, 3, 2, 1, 0]
print('list creation successful')
try:
fig, ax = plt.subplots(1, 1, figsize=(12, 6))
except Exception as exception:
print(exception.__class__.__name__ + ": ", + exception.message)
finally:
print('run subplots() successful')
plt.scatter(x, y)
print('plot creation successful')
plt.savefig('saved_plot.png')
print('code complete')
Output on PC-Good:
Start
C:\tools\miniconda3\envs\bcht\lib\site-packages\PyInstaller\loader\pyimod03_importers.py:623: MatplotlibDeprecationWarning:
The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and will be removed in 3.3.
exec(bytecode, module.__dict__)
Import of matplotlib & pyplot successful
list creation successful
run subplots() successful
plot creation successful
DEBUG:matplotlib.font_manager:findfont: ...
(and many more matplotlib DEBUG messages)
code complete
Output on PC-Bad:
Start
C:\tools\miniconda3\envs\bcht\lib\site-packages\PyInstaller\loader\pyimod03_importers.py:623: MatplotlibDeprecationWarning:
The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and will be removed in 3.3.
Import of matplotlib & pyplot successful
list creation successful
Since I get no error output, I'm quite lost as to where to go next. Matplotlib documentation doesn't offer any additional tips on getting more granular debug messages for methods like plot or subplots. Has anyone else observed such an issue or know of a fix? Or does anyone know if there's a way to get Matplotlib to tell me more?
There can be multiple reasons for this.
Pyinstaller didn't include modules "completely" : pyinstaller tries to reduce size by including only those parts of modules which are used by your application. It might not have detected the use of some vital part of module and not included it. Try using pyinstaller in one directory mode. Then you will be able to see the module selected by pynstaller. If something is missing then next time you can specify to include that module.
Try putting checkpoints like print("reached some function") in your code for debugging purpose. It will make it easier to find where is the problem.
Also try to run the code in a normal python on target computer.
I found a workaround for this issue, which I can't call a fix yet due to the fact that neither PyInstaller nor MatPlotlib provides any debug message to further the investigation for rootcause. Nevertheless, it gets rid of the issue that I was seeing.
TL;DR
Issue is due to incompatibility when using PyInstaller to generate executable with Python codes with matplotlib 3.1.3 and numpy 1.18.1. This incompatibility does not cause the python script itself to error out. This incompatibility does not produce any error message or symptoms that would point to itself, thus, making it difficult to rootcause.
If anyone observes a frozen executable quitting silently without any error message. It's worthwhile to investigate whether this is due to library incompatibility. If the quitting occurs during execution of mpl methods, then look into numpy immediately.
Now the TL:
It started with a suspicion that the issue was due to virtual environment or conda meddling with the freezing process (they are not) so I used another computer to install a clean python (3.7.9), and matplotlib 3.1.3 which populated all its dependencies automatically (let's call this new environment "lean env" and the Source PC in the problem statement "full env"). I replicated the bundling/freezing process on lean env and everything works fine. At this point, I noticed that a number of libraries in the lean env are newer than the full env. So I upgraded them all on the full env, including:
numpy from 1.18.1 to 1.20.0
kiwisolver from 1.3.0 to 1.3.1
After this, the full env is also able to generate a bundle that works perfectly fine when run on both Source PC and Target PC. So the problem is likely to be the "silent" incompatibility between matplotlib 3.1.3 and one of those two.
To narrow things further, I reverted numpy to 1.18.1 in the full env and reproduced the old problem I saw. There it is.
The frustrating aspect of this is that neither numpy nor matplotlib generated any discernable error (nor Pyinstaller). In addition, matplotlib itself does not have any method to produce any useful verbose debug message to further the investigation. (I did turn on the log_level of matplotlib to debug, but only got some info indicating the fonts being used.) For this reason, I will not proceed any further to investigate. The workaround is sufficient for my use. If anyone else is interested, feel free to proceed by interrogating mpl. Neither will I conduct further interop between pyinstaller, matplotlib, and numpy. All I'll say is:
Good: matplotlib==3.1.3, numpy==1.20.0, pyinstaller==3.6
Bad: matplotlib==3.1.3, numpy==1.18.1, pyinstaller==3.6

Changing Matplotlib Backend crashes debug mode

It seems like nobody had this problem before: When running the following code lines in DEBUG mode, my python crashes. I'm using python 2.7 with PyCharm 2016.3.
import matplotlib
matplotlib.use("qt4agg")
from matplotlib import pyplot as plt
If I run stepwise, it works. But if I set the breakpoint after this block, matplotlib.use() and import pyplot seem to get in each other's way. Does anyone know the problem?
So I was finally able to figure it out: The solution is to uncheck the "PyQt compatible" option under Python Debugger in the Project Settings of PyCharm. This option seems to cause the mentioned issues when using pyqt and debug mode.

matplotlib crashing Python

I'm new to Python and matplotlib. A simple script I wrote is crashing and I was able to reproduce the crash with the following code:
import matplotlib.pyplot as plt
plt.figure(1)
plt.figure(2)
#plt.show()
The error is python.exe has stopped working. If I uncomment the plt.show(), it still crashes depending on the order I close the plots (no crash if 2 is closed first, crash if 1 is closed first). I'm using Windows 7, Python 3.4, and I installed the individual modules from www.lfd.uci.edu/~gohlke/pythonlibs/. Do I have something configured incorrectly or a misunderstanding of how to use matplotlib?
You need to set the TkAgg backend explicitly. With the following code, the problem is resolved.
import matplotlib
matplotlib.use("TkAgg")
from matplotlib import pyplot as plt
Note that setting the TkAgg backend after importing pyplot does not work either; it crashes too. You need to set it before importing pyplot.
I was having this issue, I thought it was some line in my code causing the bug, but in fact the very act of importing matplotlib.pyplot was killing my program. I solved it by first running it in verbose mode:
python -v [programname].py
This shows the last action the importer does before crashing. For me, the last line of this was:
import 'PyQt5' # <_frozen_importlib_external.SourceFileLoader object at 0x000001F8EC9C0908>
This suggested to me that the dependent library PyQt5 was causing issues, so I ran pip install PyQt5, and magically everything started working.
This could be issue with python 3.x
I have tried with python 2.7 on my windows machine and it works perfectly fine!
You can either downgrade your python to 2.7 or if you feel its too late to do why dont you give it a try to call close()
Import matplotlib
matplotlib.use('wxAgg')
Import matplotlib.pyplot as plt
# your scripts
plt.close('all')
I had a similar issue in OSX when I updated to Python 3.4. IDLE was also crashing and there was a warning telling me the version was unstable.
I solved it by following the prompts and updating the version of Tcl/Tk (8.5.9) - http://www.python.org/download/mac/tcltk .
For macOS, just make sure that
~/.matplotlib/matplotlibrc contains:
backend: MacOSX
You don't need the other backends unless you specifically want them. Alternatively, perhaps you can do:
import matplotlib
matplotlib.use("MacOSX")
though I have not tested that.

Categories

Resources