Python3 plot not showing in WSL - python

I'm pretty new to Python. I have a simple script that shows a simple plot on the console. It works perfectly when I execute the script in VSCode, and the plots shows up as expected. However, when running the same script in Python in WSL, the plot doesn't show up, and I also don't get any error messages.
I'm on Windows 10.
Here is my code snippet that I typed directly in Python under WSL:
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [x**2 for x in x]
plt.plot(x,y)
[<matplotlib.lines.Line2D object at 0x7f57445be700>] # I get this message and I don't know what this means.
plt.show() # No error message, but the plot doesn't show up in my console.
Again, the plot shows up when I execute the script in VSCode.
How can I display the plot under WSL?

Since you say that your MRE works in Visual Studio Code, I'm guessing:
You are using the Windows version of Python in VSCode
Or you are using Jupyter Notebooks there.
Edit: I just noticed your comment:
It's interesting because when I run the same code in regular command prompt (not bash), the plot shows up
So yes, it appears that you are also running the Windows version of Python. You can use WSL inside of VSCode, but that's not what you doing in this case, it seems.
Under WSL, there may be several things you need to do, depending on your Windows version:
First, Windows 11 is recommended here, since it includes built-in support for displaying Linux GUI applications.
Older versions of WSL on Windows 10 do not support this directly. On Windows 10, you'll need to either install a third-party X server or use XRDP. The easiest way to do this (other than Windows 11) is with Xfce4 + XRDP, but it's definitely the slowest method as well. Also see my answer on What's the easiest way to run GUI apps on Windows Subsystem for Linux?.
Since you are on Windows 10, you'll have to get GUI support working first on WSL. Test with something like xterm to make sure you have it working) and then come back here.
[<matplotlib.lines.Line2D object at 0x7f57445be700>]
I get this message and I don't know what this means.
That's an easy one. When you are entering code directly into the Python REPL, it will always show the value/return-result for each line. All of the other lines that you typed up to that point either had no return result or you stored the return value in a variable. In the doc, you'll notice that the return value from plot is a "list of Line2D" objects.
You could suppress the message by simply storing the result in a variable, but there's no need for this in the REPL.
plt.show()
No error message, but the plot doesn't show up in my console.
Hmmm. When I try that in a base Ubuntu 22.04 distribution under WSL, I do get an error message:
<stdin>:1: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
Since you aren't receiving an error, it appears (from the doc) that Matplotlib is detecting some GUI environment and auto-selecting a higher-precedent backend because of this:
Without a backend explicitly set, Matplotlib automatically detects a usable backend based on what is available on your system and on whether a GUI event loop is already running. The first usable backend in the following list is selected: MacOSX, QtAgg, GTK4Agg, Gtk3Agg, TkAgg, WxAgg, Agg. The last, Agg, is a non-interactive backend that can only write to files. It is used on Linux, if Matplotlib cannot connect to either an X display or a Wayland display.
But I don't know why you aren't getting an error (but also no display) on that backend. It might be useful to run plt.get_backend() to see which backend Matplotlib has auto-selected. For me, on a freshly installed Ubuntu, that's agg, but it sounds like that's going to be different for you.
Regardless, that brings us to the next likely step -- Make sure that all dependencies for a Matplotlib GUI backend are enabled. This includes:
The Linux libraries needed for the selected backend.
The Python modules needed for the selected backend.
On a typical Ubuntu installation, the Linux libraries would already be installed, since Linux desktop installations are running GUI's. However, the Ubuntu/WSL distributions are based on Ubuntu Server, and don't include any graphical apps out-of-the-box.
Assuming you want to use the Qt5 backend, which is the highest priority other than Mac in the Matplotlib auto-select list, we'll need to install those libraries:
sudo apt install libqt5gui5
Then, as per this answer, you'll need the Python support for Qt5:
# Don't do this yet. Read next step.
pip install pyqt5
Note: It's recommended that you do this in a virtual environment (venv) so that you don't "pollute" your system Python installation with unnecessary libraries. Since you are new to Python, I'm going to recommend that you read-up on Python virtual environments, but here's the summary to get started:
sudo apt install python3-venv
cd <project_dir>
python3 -m venv .venv
source .venv/bin/activate
Your prompt should change to include (.venv) to show that the environment is active.
Then, anything you pip install will be in that virtual environment rather than your system environment:
# Now we can do this "safely"
pip install pyqt5
python3
With this in place, try your code again. Hopefully, you should now see that plt.get_backend() returns qtAgg. If not, then there's additional troubleshooting to do.
And with that in place, plt.plot() should (it does for me) display the plot directly on the screen.

Related

The same program written in Jupyter notebook with Pyhon 3.7 doesn't work somewhere else

Imagine the situation like below. There must be simple explanation.
I have a program written in Jupyter notebook and use Python 3.7. There is no errors while executing the program and works on two PC computers. As I remember there where just only Python 3.7 (and adds like matplotlib etc. all what is needed).
Then on the others computers where is Python 3.8 the same programs gives me an error. Why?
I took another two PC removed all Python installation and install 3.7 3.8 3.9 3.10 Python (tried every of them) and I can't execute the programs without error. Why is like that? All extensions like matplotlib, numpy , scipy which is needed every time are install in proper way by pip etc...Path in Windows are always correct.
It seems to me that on those two computer where program work fine was only Python 3.7 (but I am not sure in 100% that there hadn't been installed previous version of the Python) the programs works. Any other installation or refreshment of the Python makes that teh program gives me errors.
The only one what I should to do is 100% reset Windows and do fresh and the newest one Python instillation (Jupyther etc.) and check whether the error exist or not. But I would like to know what makes the problem and not to refresh all my Windows installation every time.
The problem is even more interesting when I am taking the same program
and put them to the virtual Jupyther using the Internet and browser they always work fine without any errors and there is for sure the news Python engine I guess not 3.7.
Did you try to execute "pip freeze" or "conda list" on these computers (with Ananconda Powershell for ex.) to verify that all the libraries' versions you are using are the same?
Looking at the error on the screenshot, I would bet that the problem does not come from your Python version but more from a higher version on matplotlib installed on the first two PCs, which makes that the third one (with potentially an older version of matplotlib) does not support the arguments given.
Just try executing:
(base) PS C:\XXX\Python> conda list matplotlib
and should get the version of matplotlib installed on each PC, like this:
# packages in environment at C:\XXX\Miniconda3:
#
# Name Version Build Channel
matplotlib 3.4.2 pypi_0 pypi
matplotlib-inline 0.1.2 pypi_0 pypi
If they are different, this might be where the issue comes from.

Matplotlib crashes when importing pyplot in Blender

I know this question has been asked many times before but I cannot find a solution that works for me. I'm running Python 3.5.3 under Blender 2.79 in Windows 10. As I require Blender 2.79, upgrading the Python version is not possible.
I've installed matplotlib and I can import it. However, when I try to import pyplot (e.g. import matplotlib.pyplot as plt), I get a crash to desktop with no error messages of any kind. This happens if I run Python externally or from inside Blender. The weird thing is that I was able to avoid this by changing backends to agg (matplotlib.use('agg')) and this is still working in a previous installation (so I know it's possible to get this to work !), but not in a separate, new installation of Blender. I've tried other backends but they make no difference.
The exact procedure I've tried is as follows :
Downloaded Blender 2.79 from a zip file (I'm using Windows 10) and unpacked it (call this directory /Blender/)
In /Blender/2.79/python/bin I run the command ./python -m ensurepip
In /Blender/2.79/python/scripts I run pip3 install --upgrade pip --user. This gives me pip3 version 20.2.4
In the same directory I run pip3 install --target="/Blender/2.79/python/lib/site-packages" matplotlib --upgrade. The "upgrade" switch is to prevent warnings that the "/bin" directory exists. Doesn't make any difference if I remove it, there's no existing installation of matplotlib. This gives me matplotlib version 3.0.3
Finally I start Python by /Blender/2.79/python/bin/python.exe, and do the above mentioned importmatplotlib.pyplot command which causes the crash.
I've tried this from a completely fresh installation of Blender, which comes with no existing external modules installed. Could there be some conflict with other Python modules elsewhere ? How would I go about diagnosing what's going on ?
Thanks for any ideas !
FIXED ! I remembered I found the solution months ago, but stupidly wrote down the answer in the wrong file...
The problem is that matplotlib is looking for a file that doesn't exist. In c:/users/me/.matplotlib (a hidden file), there's a file ""fontlist-vXXX.json", where XXX is the version number. This is set in line 951 of the file "font_manager.py", located in /python/lib/site-packages/matplotlib. In my case, the font_manager was looking for version 300 but the actual file was 310. Changing the version number in the font_manager.py made everything work correctly.

Which backend for matplotlib using MacOS?

The question of using matplotlib with MacOS is a tricky one which has already been thoroughly reviewed by a number of discussions (see below). The problem is the following:
using MacOS Mojave 10.14.3
using python 3.7.2 in a conda environment
using matplotlib 3.0.3
Here is the simplest code snippet I came up with which allows reproducing the issue:
from matplotlib import pyplot as plt
x = [1, 2, 3]
y = [1, 2, 3]
plt.plot(x, y)
plt.show()
This throws the following error:
2019-03-22 12:25:43.429 python3.7[22209:554135] -[NSApplication _setup:]: unrecognized selector sent to instance 0x7f85866b9de0
2019-03-22 12:25:43.431 python3.7[22209:554135] \*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSApplication _setup:]: unrecognized selector sent to instance 0x7f85866b9de0'
*** First throw call stack:([...])
libc++abi.dylib: terminating with uncaught exception of type NSException
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
The issue is documented here. One solution is to install the PyQt5 package to your Python installation and to add the following lines at the beginning of your script:
import matplotlib
matplotlib.use("Qt5Agg")
While this works perfectly well, I am wondering why other backends fail to provide similar behavior.
Indeed I tried using MacOSX backend :
import matplotlib
matplotlib.use('MACOSX')
Which yields to the error:
from matplotlib.backends import _macosx
ImportError: 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.
The issue is documented here, there and in plenty of other threads.
Two solutions came out :
install python.app(conda install python.app) and launch your script with pythonw instead of python
use TKAggbackend
Using the first one works well but I wonder:
why do we need to call pythonw instead of python ?
what exactly is the python.app package ?
how can we make this solution work using an IDE (let say PyCharm for instance) ?
As for the second one, it does "work" up to a certain point: when running matplotlib using TkAgg, the plot window is really buggy. Indeed, it often needs several clicks on the "zoom", "pan" or "home" buttons to get them to actually work. It really is a great pain to use it. I asked several colleagues or friends using matplotlib with TkAgg and they all have the same issue.
Does anyone know the reason for this state of fact? Or if there is any workaround to avoid this issue (apart from installing pyqt5)?
Using the first option is your best bet since you are already working with a virtual environment.
According to matplotlib, there are two variants of python:
A Framework build - Quite important for GUI stuffs in MacOXs
A regular build.
Matplotlib in this case would want to interact natively with OSX and for this, it needs the Framework build this is the reason why installing the python.app type of python is important.
More information can be gotten from Matplotlib FAQ.
Check this link for more about the need for a framework build python.
I'm going to make some assumptions. If they're wrong I apologize.
You installed Python with Anaconda.
Personally, I've never had any problems on mac with matplotlib. My setup is: Mojave, Python3.7.3 in a venv using the python built in module (python3 -m venv), and matplotlib 3.0.3.
I can't answer your question on how to fix your problem, but I'm kind of trying to answer your "is there any workaround" question. Personally, I've always had issues with using Anaconda/Spyder/Conda for Python. I've always felt installing it as its own binary/app on the system leads to the fewest errors.
Now, I'm not saying you have to download and install by hand though. I use homebrew and it saves me headaches everyday I assume (such as upgrading applications and packages). That's the "work around" I'd suggest. Because isn't installing via Anaconda/Spyder already a workaround to installing Python properly? I've always felt performing one work around requires more workarounds for full functionality. Such as having to specify the matplotlib backend when it should be detected by default.
Obviously, I'm a little biased against that tool and that may be reflected in this answer, so take it with a grain of salt. Even though Conda is a legitimate tool that I think is useful, I find it annoying having to use both pip and conda when conda doesn't contain the packages I want.
There are two things you can try.
You can read Matplotlib info page on that, https://matplotlib.org/3.1.0/faq/osx_framework.html,
The default python provided in (Ana)conda is not a framework build. However, a framework build can easily be installed, both in the main environment and in conda envs: install python.app (conda install python.app) and use pythonw rather than python.
And follow the instructions.
Or simply follow the error message you get when you try %matplotlib inline,
(...)
UnknownBackend: No event loop integration for 'inline'. Supported event loops are: qt, qt4, qt5, gtk, gtk2, gtk3, tk, wx, pyglet, glut, osx
I did %matplotlib osx and have plt.imshow(myimg) working just fine afterwards.

Python's matplotlib import

On my working PC (Windows7, no internet connection) there are two Pythons: one is the main (C:\Python36-32) with IDLE. Another - freshly installed Anaconda (C:\ProgramData\Anaconda3) - just for scipy and matplotlib (IT guy thought it is the best option).
So, matplotlib works only if I run my scripts from cmd. But it is not comfortable. I prefer IDLE or any other modern environment.
But if I try use matplotlib in IDLE - I got an "No module named 'matplotlib'". I tried to edit sys.path and run:
sys.path.append("C:\\ProgramData\\Anaconda3\\Lib\\site-packages").
It helps a little bit - I got new error "No module named 'matplotlib._path'". So, it looks like IDLE knows what is matplotlib now, but doesn't know it's functions.
Is there any way to connect IDLE with Anaconda's libraries? Maybe to append paths recursively?
It's probably not a good idea to mix the python distributions through the system path.
Python should ship with IDLE. So you can use the IDLE from the Anaconda distribution,
C:\ProgramData\Anaconda3>python.exe Lib\idlelib\idle.py
Also note that Anaconda should also provide Spyder. This might be a nicer IDE.

How to use Python Matplotlib with OSx and virtualenv?

I just started learning Python's libraries for data analysis (Numpy, Pandas and Matplotlib) but have already stumbled across my first problem - getting the Matplotlib to work with virtualenv.
When working with Python I always create a new virtual environment, get my desired Python version and libraries/dependancies into this environment. This time, the course required that I use Python3, so I installed it via HomeBrew.
The challenge:
Matplotlib needs to interact with OS
to make this happen it needs the framework build of Python (the system one)
...which is not possible if it's inside of a virtualenv, which makes it use the virtualenv build of Python
The workaround that Is supposed to be common is described at this link but I am unsure how to use this (the OSX section).
My understanding of the solution:
get Python version that I wish to use, install it system wide, NOT in a virtualenv
create a virtualenv, get dependencies that I need, this creates the virtualenv Python build
somehow trick the system into using virtualenv dependancies with system build of Python
this is done with the shell script(?) which seems to modify certain variables in shell/terminal config file(s)
Questions:
am I correct with the above "explanation to myself"?
what is the correct way to do this? from within the virtualenv, from outside of it...?
after this is done, how do I execute my Python scripts? with my virtualenv activated or not?
Many thanks!
If you are using Python 2.x then, use these commands in virtual environment:
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
This makes the matplotlib work in the virtual environment too.
I used this steps to make the matplotlib running in the virtual environment.

Categories

Resources