所以似乎在 ubuntu for windows(windows 子系统 for linux)上,人们建议我们需要使用 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() ,而只是在 windows 中的/mnt/c/Users/james/plots/下保存一个 plot-148123456.png 并打开一个浏览器窗口来查看图像。
我想我可以托管该文件夹并使用浏览器。
我的目标是能够运行像上面的代码这样的简单示例,而无需将代码更改为 ftp 某处的图像等。我只是希望绘图显示在一个窗口中。
有没有人想出一个体面的方法来做到这一点?
最佳答案
好的,所以我让它按如下方式工作。我在 Windows 上安装了 Ubuntu,安装了 anaconda python 3.6。
- 下载安装VcXsrv或 Xming (X11 for Windows)来自 sourceforge(参见下面的编辑)
sudo apt-get update
sudo apt-get install python3.6-tk
(您可能需要安装不同的python*-tk
取决于您使用的 python 版本)pip install matplotlib
(用于 matplotlib。但现在许多其他的东西也可以使用)export DISPLAY=localhost:0.0
(添加到~/.bashrc
以使其永久化。参见下面的 WSL2)
无论如何,在 wsl 上的 ubuntu 中运行的这段代码按原样运行:
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()
也许这最好通过 Jupyter notebook 或其他东西来完成,但是在 Linux 子系统上的 Ubuntu for Windows 中具有基本的命令行 python matplotlib 功能非常好,这使得许多其他 gui 应用程序也可以工作。
例如,您可以安装 xeyes,它会说安装 x11-apps 并安装它将安装许多 GUI 应用程序使用的 GTK。但关键是,一旦你正确设置了 DISPLAY,并且你的 x 服务器在 windows 上,那么大多数可以在 native ubuntu 上运行的东西都适用于 WSL。
编辑 2019-09-04:今天我在升级一些库后遇到了“无法获取屏幕资源”的问题。所以我安装了 VcXsrv 并使用它而不是 Xming。只需从 https://sourceforge.net/projects/vcxsrv/ 安装并运行xlaunch.exe,选择多个窗口,next next next ok。然后一切正常。
为 WSL 2 用户编辑 2020-06-23 WSL2(目前是内部快速环)具有 GPU/docker 支持,因此值得升级。但是它在vm中运行。对于 WSL 2,请执行相同的步骤 1-4:
- ip 不是本地主机。它在 resolv.conf 中,所以改为运行它(并包含在 ~/.bashrc 中):
export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
- 现在仔细检查防火墙:Windows 安全 -> 防火墙和网络保护 -> 允许应用通过防火墙 -> 确保 VcXsrv 已检查公共(public)和私有(private)。 (第一次启动 xlaunch 时,您可能会收到允许通过防火墙的提示。这也有效。此外,如果 VcXsrv 不在应用程序列表中,您可以手动添加它,例如从 'C:\program files\vcxsrv\vcxsrv .exe')
- 启动 VcXsrv 并勾选“禁用访问控制”
注意:一些 WSL2 用户收到类似 couldn't connect to display "172.x.x.x:0"
之类的错误。如果是这样,您尝试使用以下命令检查存储在 DISPLAY 中的 IP 地址:echo $DISPLAY
。如果显示的 IP 似乎是错误的(即“8.8.8.8”或另一个不工作的 IP 地址),您需要将第 5 点中显示的 ~/.bashrc
中的代码更改为可以得到的内容您的实例的 IP 地址。一位用户说这有效:export DISPLAY=$(ifconfig | grep inet | awk '{print $2}' | head -n 1 | awk '{print $0":0"}')
。然而,对于其他一些人来说,它不起作用。 YMMV,但只需找到您的 IP 并将 if 用于 DISPLAY。对于大多数 WSL2 用户,#5 中的命令有效。
为 Windows 11 编辑:如果 MS 说服你扔掉你的旧电脑并购买一台带有 TPM 的电脑,那么你就获得了 Windows 11,你就可以免费获得 GUI。我希望他们在 Windows 10 上添加升级路径,因为 Win10 将像 XP 一样,并且持续很长时间,因为 MS 决定您需要最近的计算机,即使 Win11 在旧计算机上可以正常工作。
关于python - 在 Ubuntu(WSL1 和 WSL2)中显示 matplotlib 图(和其他 GUI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43397162/