在 Ubuntu (WSL1和 WSL2)中显示 matplotlib 图(和其他 GUI)

因此,在 ubuntu 的 windows (linux 的 windows 子系统)上,人们建议我们使用 Agg 后端,只保存图片,而不是显示图片。

import matplotlib
matplotlib.use('Agg') # no UI backend


import matplotlib.pyplot as plt
import numpy as np


t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
plt.title('About as simple as it gets, folks')


#plt.show()
plt.savefig("matplotlib.png")  #savefig, don't show

我们怎样才能让 plt.show ()真正向我们显示一个图像呢?我当前的选择是覆盖 plot.show () ,而不是仅仅在/mnt/c/Users/james/plot/in windows 下保存 plot-148123456.png,并且只打开浏览器窗口查看图像。

我想我可以托管那个文件夹,并使用浏览器。

我的目标是能够运行像上面的代码这样的简单示例,而不需要更改代码以便在某处对图像进行 ftp 等。我只是想把情节展现在橱窗里。

有人想出一个体面的方法吗?

100723 次浏览

Ok, so I got it working as follows. I have Ubuntu on windows, with anaconda python 3.6 installed.

  1. Download and install VcXsrv or Xming (X11 for Windows) from sourceforge(see edit below)
  2. sudo apt-get update
  3. sudo apt-get install python3.6-tk (you may have to install a different python*-tk depnding on the python version you're using)
  4. pip install matplotlib (for matplotlib. but many other things now work too)
  5. export DISPLAY=localhost:0.0 (add to ~/.bashrc to make permanent. see WSL2 below)

Anyways, after all that, this code running in ubuntu on wsl worked as is:

import matplotlib.pyplot as plt
import numpy as np


t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)


plt.title('About as simple as it gets, folks')
plt.show()

result: enter image description here

Maybe this is better done through a Jupyter notebook or something, but it's nice to have basic command-line python matplotlib functionality in Ubuntu for Windows on Subsystem for Linux, and this makes many other gui apps work too.

For example you can install xeyes, and it will say to install x11-apps and installing that will install GTK which a lot of GUI apps use. But the point is once you have your DISPLAY set correctly, and your x server on windows, then most things that would work on a native ubuntu will work for the WSL.

Edit 2019-09-04 : Today I was having issues with 'unable to get screen resources' after upgrading some libraries. So I installed VcXsrv and used that instead of Xming. Just install from https://sourceforge.net/projects/vcxsrv/ and run xlaunch.exe, select multiple windows, next next next ok. Then everything worked.

Edit for WSL 2 users 2020-06-23 WSL2 (currently insider fast ring) has GPU/docker support so worth upgrade. However it runs in vm. For WSL 2, follow same steps 1-4 then:

  1. the ip is not localhost. it's in resolv.conf so run this instead (and include in ~/.bashrc):
 export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
  1. Now double-check firewall: Windows Security -> Firewall & network protection -> Allow an app through firewall -> make sure VcXsrv has both public and private checked. (When Launching xlaunch first time, you might get a prompt to allow through firewall. This works too. Also, if VcXsrv is not in list of apps, you can manually add it, eg from 'C:\program files\vcxsrv\vcxsrv.exe')
  2. Launch VcXsrv with "Disable access control" ticked

Note: a few WSL2 users got error like couldn't connect to display "172.x.x.x:0". If that's you try to check the IP address stored in DISPLAY with this command: echo $DISPLAY. If the showed IP seems to be wrong (i.e. "8.8.8.8" or another not working IP address) you need to change the code in ~/.bashrc showed in the point 5 to something that will get your instance's ip address. One user said this worked: export DISPLAY=$(ifconfig | grep inet | awk '{print $2}' | head -n 1 | awk '{print $0":0"}'). However for some others it did not work. YMMV, but just find your IP and use if for DISPLAY. For most WSL2 users, the command in #5 works.

Edit for Windows 11 : if MS convinced you to throw out your old computer and buy one with a TPM and so you got Windows 11, you get GUI for free. I hope they add upgrade path to do that on Windows 10 because Win10 will be like XP and last a long time since MS decided you need recent computer even though Win11 would work fine on old computers.

To get matplotlib to work with GTKAgg on Bash on Ubuntu on Windows, I:

  1. installed VcXsrv under Windows (but things should work just the same with Xming)
  2. set DISPLAY as noted above [export DISPLAY=localhost:0.0 (add to ~/.bashrc to make permanent)]
  3. executed sudo pip uninstall matplotlib
  4. followed by sudo apt install python-matplotlib
  5. updated matplotlibrc to read backend : GTKAgg (rather than backend : agg)
  6. I also ran sudo apt-get install python-gtk2-dev, but this may not be necessary.

Uninstalling the pip-installed matplotlib and reinstalling it via apt appear to be necessary because pip does not include the C extensions needed to run GTK, but the apt version does.

I found the best approach is to install Jupyter on Windows Subsystem for Linux (WSL) by following

sudo apt update && upgrade
sudo apt install python3 python3-pip ipython3

Now you can install matplotlib

pip3 install matplotlib

And Jupyter Notebook

pip3 install jupyter

Check this link if you need more info Python setup on the Windows subsystem for Linux (WSL)

For WSL2 using Ubuntu Focal Fossa release, I downloaded and installed VcXsrv on Windows. I use this configuration:

VcXsrv configuration

I don't know for Native OpenGL but it seems important to disable access control.

Now, you need to export the env variable DISPLAY in WSL.

I found the correct address in /etc/resolv.conf, but the one found in the ifconfig result isn't. So the following command doesn't work for me:

export DISPLAY=$(ifconfig | grep inet | awk '{print $2}' | head -n 1 | awk '{print $0":0"}')

That IP address can also be found in the command ipconfig into CMD.exe command context. Search for vEthernet (WSL), that should be the one.

Now, you can test that everything is working by simply executing xcalc in your WSL environnement. If xcalc is not present, install it:

sudo apt-get update && sudo apt-get install x11-apps

xcalc command should open a application looking like this on Windows:

xcalc result

If it is working that means that the connection to your X-server is possible but you maybe need to install some extra package for Python like:

sudo apt-get install python3.x-tk

Change .x according to your python version.

Plots are also viewable on WSL using Visual Studio Code, which as of the June 2019 release, includes a "Plot Viewer".

In a regular .py file, inserting a comment string #%% marks the code as a Jupyter (IPython) cell and a code lens shows options to Run Cell. In addition, right-clicking inside a Python file includes the option:

Run Current File in Python Interactive Window

From the VS Code June 2019 release:

The June 2019 update included a brand-new Plot Viewer that can be used to manipulate any image plots, such as the popular matplotlib plots.

You can try it out by double-clicking on the plots or clicking on the “expand image” button that is displayed when you hover over plot images in the Python Interactive Window:

With the plot viewer, you can pan, zoom in/out, navigate through plots in the current session, and export plots to PDF, SVG, or PNG formats.

In my case (Windows 10, WSL2, Ubuntu 20.04 with miniconda3 and virtual environment where I installed all the required Python 3.6 packages using conda command, Windows-based Visual Studio Code with 'Python' and 'Remote - WSL' extensions) I installed VcXsrv under Windows, and added

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0

to .bashrc file in Ubuntu. Also, before running Python code from WSL, we have to launch XLaunch and select 'Disable access control' (I left 'Native opengl' checked as well). In project folder, do not name your Python file as matplotlib.py (some related issues are reported here).

With Windows 11 22000, Linux GUI apps are officially supported out of the box provided pre-requisites are met. No twaeks, No hacks, No firewall changes etc.

Pre-Requisites:

  1. Windows 11 Build 22000 or higher
  2. Installed driver for vGPU (Intel/Nvidia/AMD)

Then run the commands
wsl --update
wsl --shutdown

Done !!

Official Source : https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps

In two seperate instances (wsl1 & wls2 with ubuntu 20.04) while using PyQt5 I was missing several libxcb libraries (e.g. libxcb-icccm4) which was not printed when trying to plot. I used export QT_DEBUG_PLUGINS=1 to find out which ones and then simply installed them. Basically the steps here.

had similar problem so simply installing the supported gpu driver solved my problem. Check this out!