如何在终端中绘制图表?

时间:2016-05-18 00:46:48

标签: python python-2.7 matplotlib command-line theano

我正在研究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

生成此图表:

enter image description here 当我试图在服务器上运行它,这是一个服务器没有屏幕只有一个命令行,我可以预见到这个错误:

{{1}}

是否有方法/方法/功能在命令行中显示图表和图形?

8 个答案:

答案 0 :(得分:5)

你有几个选择:

  1. 导出为图片或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')
    
  2. 如果您的服务器支持X11转发(或者您可以启用/安装X11转发),您可以通过设置显示器SSH到服务器。从linux,运行:

    DISPLAY=:0.0 ssh -Y <server ip>
    

    这将设置您的机器以将服务器的任何显示输出转发到您的PC。如果您运行的是Windows,则可以使用MobaXterm使其变得简单,或者自己配置X11客户端。如果我没记错的话,Mac也同样容易。

答案 1 :(得分:5)

您可能有兴趣查看 uniplot,这是我专门为 ML/数据科学管道编写的 Python 库。可能正是您要找的。

与其他终端绘图仪相比,具有 4 倍的分辨率,这要归功于 Unicode。

enter image description here

我还没有像你那样做高级图形,但对于线条、散点图和直方图,它工作得很好。

答案 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 软件包非常相似。

这是一个基本示例:

enter image description here

您可以使用以下命令进行安装:

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用于在绘制之前清除端子:例如,在绘制连续数据流时,这很有用。 此处显示绘制连续数据流的示例: enter image description here

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()

enter image description here

此特定示例使用matplotlib-sixel,这是一个使用Xterm模拟Sixel兼容终端和ImageTrick的库。可以在Linux终端(通过Framebuffer)或仿真器(kittyiTerm2)中实现类似的技术。过去几年,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])

picture

答案 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)

terminalplot