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

标签 python linux matplotlib windows-subsystem-for-linux

所以似乎在 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。

  1. 下载安装VcXsrvXming (X11 for Windows)来自 sourceforge(参见下面的编辑)
  2. sudo apt-get update
  3. sudo apt-get install python3.6-tk(您可能需要安装不同的 python*-tk 取决于您使用的 python 版本)
  4. pip install matplotlib(用于 matplotlib。但现在许多其他的东西也可以使用)
  5. 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()

结果: enter image description here

也许这最好通过 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:

  1. ip 不是本地主机。它在 resolv.conf 中,所以改为运行它(并包含在 ~/.bashrc 中):
 export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
  1. 现在仔细检查防火墙:Windows 安全 -> 防火墙和网络保护 -> 允许应用通过防火墙 -> 确保 VcXsrv 已检查公共(public)和私有(private)。 (第一次启动 xlaunch 时,您可能会收到允许通过防火墙的提示。这也有效。此外,如果 VcXsrv 不在应用程序列表中,您可以手动添加它,例如从 'C:\program files\vcxsrv\vcxsrv .exe')
  2. 启动 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/

相关文章:

python - 为什么在此代码中使用 > 会产生错误?

python - python有没有可以可视化方法和类的工具?

linux - 在没有sudo的情况下在linux中关闭

linux - 在 linux 上生成有效的 ical 文件

python - 将全局设置应用于 pyplot 中的所有子图

python - 在 matplotlib 中为旋转的 3D 图形制作动画

python - 比较数据帧并输出匹配计数

python - 有序字典 python 替换键值

c++ - undefined symbol : __gnat_rcheck_CE_Invalid_Data when linking ADA with C++

python - 按组绘制变量平均值,每个条形中具有指定数量的实例