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

新手上路,请多包涵

因此,似乎在 ubuntu for 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() ,而不是在 windows 中的 /mnt/c/Users/james/plots/ 下保存一个 plot-148123456.png ,并且只打开一个浏览器窗口来查看图像。

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

我的目标是能够运行像上面的代码这样的简单示例,而无需将代码更改为 ftp 某处的图像等。我只是希望该图显示在一个窗口中。

有没有人想出一个体面的方法来做到这一点?

原文由 AwokeKnowing 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
2 个回答

好的,所以我让它按如下方式工作。我在 Windows 上安装了 Ubuntu,安装了 anaconda python 3.6。

  1. 从 sourceforge 下载并安装 VcXsrvXming (X11 for Windows)(请参阅下面的编辑)
  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()

结果: 在此处输入图像描述

也许这最好通过 Jupyter notebook 或其他东西来完成,但是在 Linux 子系统上的 Ubuntu for Windows 中具有基本的命令行 python matplotlib 功能是很好的,这使得许多其他 gui 应用程序也可以工作。

例如,您可以安装 xeyes,它会说安装 x11-apps 并安装它将安装许多 GUI 应用程序使用的 GTK。但关键是一旦您正确设置了 DISPLAY,并且您的 x 服务器在 Windows 上,那么大多数可以在本机 ubuntu 上运行的东西都将适用于 WSL。

编辑 2019-09-04 :今天我在升级一些库后遇到了“无法获取屏幕资源”的问题。所以我安装了 VcXsrv 并使用它而不是 Xming。只需从 https://sourceforge.net/projects/vcxsrv/ 安装并运行 xlaunch.exe,选择多个窗口,下一步下一步就可以了。然后一切正常。

为 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 已检查公共和私人。 (第一次启动 xlaunch 时,您可能会收到允许通过防火墙的提示。这也有效。此外,如果 VcXsrv 不在应用程序列表中,您可以手动添加它,例如从 ‘C:\program files\vcxsrv\vcxsrv 。可执行程序’)
  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 在旧计算机上可以正常工作。

原文由 AwokeKnowing 发布,翻译遵循 CC BY-SA 4.0 许可协议

还可以使用 Visual Studio Code 在 WSL 上查看绘图,截至 2019 年 6 月版本,该代码包括一个 “绘图查看器”

在常规 .py 文件中,插入注释字符串 #%% 将代码标记为 Jupyter (IPython) 单元,并且代码镜头显示选项 Run Cell 。此外,在 Python 文件中右键单击包括以下选项:

在 Python 交互窗口中运行当前文件

从 VS Code 2019 年 6 月版本开始:

2019 年 6 月的更新包括一个全新的绘图查看器,可用于操作任何图像绘图,例如流行的 matplotlib 绘图。

您可以通过双击绘图或单击在 Python 交互窗口中将鼠标悬停在绘图图像上时显示的“展开图像”按钮进行尝试:

使用绘图查看器,您可以平移、放大/缩小、浏览当前会话中的绘图,以及将绘图导出为 PDF、SVG 或 PNG 格式。

原文由 Christopher Peisert 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题