因此,在ubuntu for windows(windows subsystem 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()会给我们看一张图片吗?我当前的 Select 是覆盖绘图.show()只保存绘图-148123456.在windows中的/mnt/c/Users/james/plots/下使用png,只需打开一个浏览器窗口即可查看图像.

我想我可以把那个文件夹放在主机上,然后使用浏览器.

我的目标是能够运行简单的例子,比如上面的代码,而无需更改代码以ftp方式将图像传送到某处等.我只希望绘图显示在窗口中.

有人想出一个像样的方法吗?

推荐答案

好的,我让它工作如下.我在windows上安装了Ubuntu,并安装了anaconda python 3.6.

  1. 从sourceforge下载并安装VcXsrvXming(适用于Windows的X11)(请参见下面的编辑)
  2. sudo apt-get update
  3. sudo apt-get install python3.6-tk(您可能需要在正在使用的python版本上安装不同的python*-tk depnding)
  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()

result: enter image description here

也许这最好通过Jupyter笔记本或其他什么东西来实现,但在UbuntuFor Windows on Subsystem for Linux中有基本的命令行python matplotlib功能是很好的,这也使得许多其他gui应用程序也能工作.

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

Edit 2019-09-04:今天我在升级一些库之后遇到了"无法获取屏幕资源"的问题.所以我安装了VcXsrv,并用它代替了Xming.只需从https://sourceforge.net/projects/vcxsrv/开始安装,然后运行xlaunch.exe, Select 多个窗口,下一步确定.然后一切顺利.

Edit for WSL 2 users 2020-06-23

  1. ip不是本地主机.正在解决.因此,运行以下命令(并包含在~/.bashrc中):
 export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
  1. 现在仔细判断防火墙:Windows安全->;防火墙及;网络保护->;允许应用通过防火墙->;确保VcXsrv已进行公共和私有判断.(当第一次启动xlaunch时,您可能会得到允许通过防火墙的提示.这也有效.此外,如果VcXsrv不在应用程序列表中,您可以手动添加它,例如从"C:\program files\VcXsrv\VcXsrv.exe"添加)
  2. 在勾选"禁用访问控制"的情况下启动VcXsrv

注意:一些WSL2用户出现了类似couldn't connect to display "172.x.x.x:0"的错误.如果是这样,请try 使用以下命令判断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进行显示.对于大多数WSL2用户来说,#5中的命令有效.

Edit for Windows 11:如果微软说服你扔掉旧电脑,买一台带有TPM的电脑,这样你就有了Windows 11,你就可以免费获得GUI.我希望他们在Windows 10上添加升级路径来实现这一点,因为Win10将类似于XP,而且会持续很长时间,因为MS决定您需要最新的计算机,即使Win11在旧计算机上也可以正常工作.

Linux相关问答推荐

在Linix&;Mac中运行Reaction本机项目时出现问题

Linux在所有多行中用新值替换整个列

X86 程序集 - struct 点 - 存储/返回不正确?

如何在充满 csv 的目录中获得不同的值计数

x86_64 Linux 程序集中的逻辑与实现

在 Windows 上通过 SSH 运行 django 应用程序

如何在守护进程中使用 popen() 和 pclose() 获取通过管道执行的 shell 命令的正确退出代码?

如何安装脚本以从命令行的任何位置运行?

如何使用 Bash 读取文件中的倒数第二行?

如何使用 GDB 和 QEMU 调试 Linux 内核?

是否可以在 Linux x86 GAS 程序集中创建没有系统调用的线程?

如何在 Bash 中对齐空格分隔表的列?

使用单个命令打开 .tar.gz 文件

比较linux中两个未排序的列表,列出第二个文件中的唯一性

将标准输出作为命令行工具的文件名传递?

如何在 Linux 中使用单行命令获取 Java 版本

如何使用终端打开-虚线文件名?

Postgresql -bash:psql:找不到命令

通过 linux x86-64 函数调用保留了哪些寄存器

Linux(Ubuntu)终端-如何查看以前的页面不再可见