在 Ubuntu(WSL1 和 WSL2)中显示 matplotlib 图(和其他 GUI)
- 2024-10-24 08:51:00
- admin 原创
- 115
问题描述:
因此,似乎在适用于 Windows 的 ubuntu(适用于 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 传输到某处等。我只希望情节显示在窗口中。
有谁找到一个不错的方法来做到这一点?
解决方案 1:
好的,我按照如下方法让它工作了。我在 Windows 上安装了 Ubuntu,并安装了 anaconda python 3.6。
从 sourceforge下载并安装VcXsrv或Xming (Windows 的 X11)(请参阅下面的编辑)
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 笔记本或其他东西来完成这一点会更好,但在 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 支持,因此值得升级。但是它在虚拟机中运行。对于 WSL 2,请按照相同的步骤 1-4 然后:
该 IP 不是 localhost。它在 resolv.conf 中,因此运行它(并包含在 ~/.bashrc 中):
export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
现在仔细检查防火墙:Windows 安全 -> 防火墙和网络保护 -> 允许应用程序通过防火墙 -> 确保 VcXsrv 已选中公共和私人。(首次启动 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 地址),则需要将~/.bashrc
第 5 点中显示的代码更改为可以获取实例 IP 地址的代码。一位用户说这有效:export DISPLAY=$(ifconfig | grep inet | awk '{print $2}' | head -n 1 | awk '{print $0":0"}')
。但是对于其他一些用户来说,它不起作用。YMMV,但只需找到您的 IP 并将其用于 DISPLAY。对于大多数 WSL2 用户,#5 中的命令有效。
针对 Windows 11 进行编辑:如果 MS 说服您扔掉旧电脑并购买一台带有 TPM 的电脑,这样您就得到了 Windows 11,您可以免费获得 GUI。我希望他们添加在 Windows 10 上执行此操作的升级路径,因为 Win10 将像 XP 一样持续很长时间,因为 MS 认为您需要最新的电脑,即使 Win11 在旧电脑上运行良好。
解决方案 2:
还可以使用 Visual Studio Code 在 WSL 上查看图表,自 2019 年 6 月发布以来,Visual Studio Code 包含一个“图表查看器”。
在常规 .py 文件中,插入注释字符串#%%
会将代码标记为 Jupyter (IPython) 单元,并且代码透视图会显示选项Run Cell
。此外,在 Python 文件内单击鼠标右键还会显示以下选项:
在 Python 交互窗口中运行当前文件
从 VS Code 2019 年 6 月版本开始:
2019 年 6 月的更新包括一个全新的绘图查看器,可用于操作任何图像绘图,例如流行的 matplotlib 绘图。
您可以通过双击图表或单击在 Python 交互窗口中将鼠标悬停在图表图像上时显示的“展开图像”按钮来尝试一下:
使用图表查看器,您可以平移、放大/缩小、浏览当前会话中的图表以及将图表导出为 PDF、SVG 或 PNG 格式。
解决方案 3:
对于使用 Ubuntu Focal Fossa 版本的WSL2 ,我在 Windows 上下载并安装了VcXsrv。我使用以下配置:
我不知道Native OpenGL但禁用访问控制似乎很重要。
现在,您需要DISPLAY
在 WSL 中导出环境变量。
我在 中找到了正确的地址/etc/resolv.conf
,但结果中找到的地址ifconfig
不正确。因此以下命令对我不起作用:
export DISPLAY=$(ifconfig | grep inet | awk '{print $2}' | head -n 1 | awk '{print $0":0"}')
ipconfig
该 IP 地址也可以在命令上下文中找到CMD.exe
。搜索vEthernet (WSL)
,应该就是那个。
现在,您只需在 WSL 环境中执行 xcalc 即可测试一切是否正常。如果不存在 xcalc,请安装它:
sudo apt-get update && sudo apt-get install x11-apps
xcalc 命令应该在 Windows 上打开一个如下所示的应用程序:
如果它正常工作,则意味着可以连接到你的 X 服务器,但你可能需要为 Python 安装一些额外的包,例如:
sudo apt-get install python3.x-tk
.x
根据你的python版本进行更改。
解决方案 4:
在 Windows 11 22000 中,只要满足先决条件,Linux GUI 应用程序即可获得官方支持。无需调整、无需黑客攻击、无需更改防火墙等。
先决条件:
Windows 11 Build 22000 或更高版本
已安装 vGPU 驱动程序 (Intel/Nvidia/AMD)
然后运行命令
wsl --update
wsl --shutdown
完毕 !!
官方来源: https: //learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps
解决方案 5:
为了使 matplotlib 与Windows 上 Ubuntu 上的 Bash上的 GTKAgg 一起工作,我:
在 Windows 下安装了 VcXsrv(但使用 Xming 应该可以正常工作)
按照上述说明设置 DISPLAY [
export DISPLAY=localhost:0.0
(添加到 ~/.bashrc 以使其永久生效)]执行
sudo pip uninstall matplotlib
其次是
sudo apt install python-matplotlib
更新 matplotlibrc 为
backend : GTKAgg
(而不是backend : agg
)我也跑了
sudo apt-get install python-gtk2-dev
,不过这个可能没有必要。
卸载通过 pip 安装的 matplotlib 并通过 apt 重新安装它似乎是必要的,因为 pip 不包含运行 GTK 所需的 C 扩展,但 apt 版本包含。
解决方案 6:
就我的情况而言(Windows 10、WSL2、带有 miniconda3 的 Ubuntu 20.04 和虚拟环境,我在其中使用命令安装了所有必需的 Python 3.6 包conda
,基于 Windows 的 Visual Studio Code 带有“Python”和“Remote - WSL”扩展),我在 Windows 下安装了 VcXsrv,并添加了
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
到.bashrc
Ubuntu 中的文件。此外,在从 WSL 运行 Python 代码之前,我们必须启动XLaunch
并选择“禁用访问控制”(我还选中了“Native opengl”)。在项目文件夹中,不要将您的 Python 文件命名为(此处matplotlib.py
报告了一些相关问题)。
解决方案 7:
在两个不同的实例(wsl1 和 wls2,使用 ubuntu 20.04)中使用 PyQt5 时,我缺少几个 libxcb 库(例如 libxcb-icccm4),尝试绘图时未打印这些库。我过去常常export QT_DEBUG_PLUGINS=1
找出哪些库,然后简单地安装它们。基本上步骤如下。
解决方案 8:
有类似的问题,所以只需安装支持的 gpu 驱动程序即可解决我的问题。看看这个!
解决方案 9:
我发现最好的方法是按照以下步骤在 Windows Subsystem for Linux (WSL) 上安装 Jupyter
sudo apt update && upgrade
sudo apt install python3 python3-pip ipython3
现在你可以安装 matplotlib
pip3 install matplotlib
和 Jupyter Notebook
pip3 install jupyter
如果你需要有关在 Windows 子系统(WSL)上设置 Linux 的 Python 的更多信息,请查看此链接
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件