JuliaPy / PyPlot.jl

Plotting for Julia based on matplotlib.pyplot
https://github.com/JuliaPy/PyPlot.jl
MIT License
475 stars 87 forks source link

No working GUI backend found for matplotlib #418

Open stumarcus314 opened 5 years ago

stumarcus314 commented 5 years ago

I am getting the above warning when I try to use PyPlot for plotting and no plots show up. I followed the instructions here (https://github.com/JuliaPy/PyPlot.jl/issues/219), but it still didn't fix the issue when I try to call the Julia script which tries to use PyPlot. In the Julia terminal, after following those instructions, the warning does not show up but I also cannot get the basic example to show up. I use Julia v0.6.4 on MacOS. PyPlot used to work for me several months ago, and just tried to use it again today. I've done at least one Pkg.update() since the last time PyPlot worked.

stumarcus314 commented 5 years ago

I installed XQuartz and logged out and logged back in, but still same warning. Should I Pkg.update() after installing XQuartz?

stumarcus314 commented 5 years ago

I tried the following, but still same error. I don't understand the instructions to install python.app, etc... Sounds complicated.

python Python 2.7.14 |Anaconda custom (64-bit)| (default, Oct 5 2017, 02:28:52) [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin Type "help", "copyright", "credits" or "license" for more information.

import matplotlib.pyplot Traceback (most recent call last): File "", line 1, in File "/Users/a598124/anaconda2/lib/python2.7/site-packages/matplotlib/pyplot.py", line 115, in _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup() File "/Users/a598124/anaconda2/lib/python2.7/site-packages/matplotlib/backends/init.py", line 62, in pylab_setup [backend_name], 0) File "/Users/a598124/anaconda2/lib/python2.7/site-packages/matplotlib/backends/backend_macosx.py", line 17, in from matplotlib.backends import _macosx RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.

stumarcus314 commented 5 years ago

I looked at the instruction: https://matplotlib.org/faq/osx_framework.html Should I install python.app via: conda install python.app How do I use pythonw rather than python? Must Julia be signalled to use pythonw instead of python?

tkf commented 5 years ago

If you need to configure Python executable to be used from PyPlot.jl etc., you need to do it via PyCall.jl. See: https://github.com/JuliaPy/PyCall.jl#specifying-the-python-version

stumarcus314 commented 5 years ago

Can someone help me resolve this issue?

stevengj commented 5 years ago

Maybe you have a .matplotlibrc file that is trying to use an unsupported backend. Try ENV["MPLBACKEND"]="tkagg"

stumarcus314 commented 5 years ago

When I tried the following, I get "Warning: No working GUI backend found for matplotlib"

using PyPlot ENV["MPLBACKEND"]="tkagg" x = linspace(0,2pi,1000) y = sin.(3 x + 4 cos.(2 x)) plot(x, y, color="red", linewidth=2.0, linestyle="--") title("A sinusoidally modulated sinusoid")

KestutisMa commented 5 years ago

PyPlot not working on Julia v1.1 (on Linux): using PyPlot; plot(rand(10)) - no figure On Windows same code shows figure.

p.s. on Linux Julia show() command gives: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.

stevengj commented 5 years ago

You need ENV["MPLBACKEND"]="tkagg" etc. before using PyPlot if you want it to affect the backend.

stevengj commented 5 years ago

@KestutisMa, what are PyPlot.backend and PyPlot.PyCall.python?

You could try using ENV["MPLBACKEND"]="tkagg" to specify a different backend (e.g. tkagg, qt5agg, gtkagg, …)

KestutisMa commented 5 years ago

Thanks for reply, Steven. I tried but still no plot window, but now I don't get warning message.

julia> ENV["MPLBACKEND"]="qt5agg"; using PyPlot; PyPlot.plot(rand(10)); PyPlot.ion(); PyPlot.show()

julia>
KestutisMa commented 5 years ago

I just figured out: I need to do pygui(true) now I got figure shown! :-)

stumarcus314 commented 5 years ago

ENV["MPLBACKEND"]="tkagg" using PyPlot pygui(true)

The above lines in the Julia command window give: ERROR: No working GUI backend found for matplotlib. Stacktrace: [1] pygui(::Bool) at /Users/a598124/.julia/v0.6/PyPlot/src/init.jl:222

PyPlot.backend is "Agg" and PyPlot.PyCall.python is "/Users/a598124/.julia/v0.6/Conda/deps/usr/bin/python".

MaxandreJ commented 5 years ago

I just figured out: I need to do pygui(true) now I got figure shown! :-)

This solved my problem. It seems that unlike the previous versions, calling pygui(true) is now necessary to have interactive figures displayed, even if the matplotlib backend is correctly set.

The error I had

/Users/maxandrejacqueline/anaconda3/envs/snakes/lib/python3.7/site-packages/matplotlib/figure.py:445: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
  % get_backend())

Could perhaps be amended to be more informative? Ideally, it should distinguish the case that pygui(true) hasn't been called and that when the backend of matplotlib is not correctly set.

stevengj commented 5 years ago

You only need pygui(true) to get interactive figures if you are running in a Jupyter notebook, because in Jupyter PyPlot defaults to inline display. This has always been the case.

If you run from a REPL, it defaults to interactive figures and there is no need to call pygui(true).

jjstickel commented 1 year ago

Although this is old (but still "open"), I'm posting here because this was the top link when I googled my problem. I'm using macports' installed python, matplotlib, and pyqt5 on an M2 Mac. Despite having backend : QtAgg in my matplotlibrc file (and plotting working fine from an ipython shell), I was experiencing this in Julia:

julia> using PyCall

julia> pygui()
:tk

julia> pygui(:qt)
:qt

julia> using PyPlot
┌ Warning: No working GUI backend found for matplotlib
└ @ PyPlot ~/.julia/packages/PyPlot/2MlrT/src/init.jl:153

It turns out that pygui(:qt) is not sufficient, but rather pygui(:qt5)! It also works to use ENV["MPLBACKEND"]="Qt5Agg" in startup.jl. Hope this helps someone else.