我正在研究ML / Theano,最近遇到了这个剧本:https://gist.github.com/notmatthancock/68d52af2e8cde7fbff1c9225b2790a7f这很酷。和所有ML研究人员一样,我最近升级到服务器,虽然功能更强大,但它也给我带来了一个问题。
脚本很长,但它以这段代码结束:
fedora@ip-173-33-18-911:~/scripting/spiral$ python spiral.py
Iteration 2000 / 2000, Loss: 0.172083
Traceback (most recent call last):
File "spiral.py", line 133, in <module>
plot_stuff(inputs, outputs, losses, net_func, n_hidden)
File "spiral.py", line 110, in plot_stuff
fig,axes = plt.subplots(1,2,figsize=(12,6))
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 1046, in subplots
fig = figure(**fig_kw)
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 423, in figure
**kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 79, in new_figure_manager
return new_figure_manager_given_figure(num, figure)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 87, in new_figure_manager_given_figure
window = Tk.Tk()
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1767, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
生成此图表:
当我试图在服务器上运行它,这是一个服务器没有屏幕只有一个命令行,我可以预见到这个错误:
{{1}}
是否有方法/方法/功能在命令行中显示图表和图形?
答案 0 :(得分:5)
你有几个选择:
导出为图片或PDF。此处的信息:http://matplotlib.org/faq/howto_faq.html以下是关键信息:
# do this before importing pylab or pyplot
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3])
fig.savefig('test.png')
如果您的服务器支持X11转发(或者您可以启用/安装X11转发),您可以通过设置显示器SSH到服务器。从linux,运行:
DISPLAY=:0.0 ssh -Y <server ip>
这将设置您的机器以将服务器的任何显示输出转发到您的PC。如果您运行的是Windows,则可以使用MobaXterm使其变得简单,或者自己配置X11客户端。如果我没记错的话,Mac也同样容易。
答案 1 :(得分:5)
您可能有兴趣查看 uniplot,这是我专门为 ML/数据科学管道编写的 Python 库。可能正是您要找的。p>
与其他终端绘图仪相比,具有 4 倍的分辨率,这要归功于 Unicode。
我还没有像你那样做高级图形,但对于线条、散点图和直方图,它工作得很好。
答案 2 :(得分:4)
asciiplotlib(属于我的一个小项目)在这里可能会派上用场。使用
安装pip3 install asciiplotlib
并生成类似
的终端图import asciiplotlib as apl
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = [np.sin(m)+m for m in x]
fig = apl.figure()
fig.plot(x, y, width=60, height=20)
fig.show()
7 +---------------------------------------------------+
| |
6 | ** |
| ** |
| ** |
5 | ** |
| *** |
4 | **** |
| ***** |
3 | ***************** |
| **** |
2 | *** |
| *** |
| *** |
1 | ** |
|** |
0 +---------------------------------------------------+
0 1 2 3 4 5 6 7
答案 3 :(得分:4)
检查软件包plotext,该软件包允许使用python3在终端上直接绘制数据。它非常直观,因为其用法与 matplotlib 软件包非常相似。
这是一个基本示例:
您可以使用以下命令进行安装:
sudo -H pip install plotext
对于matplotlib,主要功能是散点图(用于单点),图(用于线连接的点)和 show (在终端上实际打印图)。可以很容易地指定绘图尺寸,点和线型以及显示轴,数字刻度和最终方程式的任何内容,这些用于将绘图坐标转换为原始实数值。
以下是产生以上所示图的代码:
import plotext.plot as plx
import numpy as np
l=3000
x=np.arange(0, l)
y=np.sin(4*np.pi/l*np.array(x))*np.exp(-0.5*np.pi/l*x)
plx.scatter(x, y, rows = 17, cols = 70)
plx.show(clear = 0)
clear=True
中的选项show
用于在绘制之前清除端子:例如,在绘制连续数据流时,这很有用。
此处显示绘制连续数据流的示例:
package description提供了有关如何自定义图的更多信息。 该软件包已经在Ubuntu 16上进行了完美的测试。未来可能的开发(应要求)可能涉及到python2和其他图形界面(例如jupiter)的扩展。如果您在使用它时遇到任何问题,请告诉我。谢谢。
我希望这能回答您的问题。
答案 4 :(得分:4)
可以在终端和终端仿真器中绘制光栅图像:
import matplotlib
matplotlib.use('module://matplotlib-sixel')
from pylab import *
plt.plot(sin(arange(100) / 10))
show()
此特定示例使用matplotlib-sixel,这是一个使用Xterm模拟Sixel兼容终端和ImageTrick的库。可以在Linux终端(通过Framebuffer)或仿真器(kitty或iTerm2)中实现类似的技术。过去几年,FOSS社区提供了出色的解决方案(例如libsixel)。
另一种选择是使用X11 forwarding或使用基于lsix的基于Sixel的打印机。但是所有这些选项都将在Python Shell本身之外发生。
当然,与尝试在终端中拔出图像相比,最好在服务器中运行Jupyter Notebook。这可能不值得。
答案 5 :(得分:3)
我创建了一个名为termplot
的小包,它从列表中创建一个垂直条形图。
pip install termplot
import termplot
termplot.plot([1,2,3,4,-5,5,-4,-1,0,-10,-4,-2,3,5,8,10,12,10,8,7,6,5,4,3,2,1])
答案 6 :(得分:2)
如果要使用图表弹出外部窗口,请运行绘图,然后
>>> matplotlib.pyplot.show(block=True)
这将在单独的窗口中弹出图表。
如果您在此次通话之前多次拨打plot()
,则会在相应的图表中弹出相同数量的窗口。只有在关闭所有弹出的图表窗口时,Control才会返回到Python。
我喜欢将它包装在一个小帮助函数中,如下所示:
def show():
return matplotlib.pyplot.show(block=True)
然后,只要我想看到任何尚未显示的情节,我就会致电show()
。
答案 7 :(得分:1)
在我看来,{@ 3}比@ William234234建议的软件包更完整,可能是一个很好的解决方案。
用法示例:
import terminalplot as tp
import numpy as np
from math import sin, pi
x=np.linspace(0,2*pi,100);
y=[sin(m)+m for m in x];
tp.plot(list(x),y)