如何在终端上绘制图表?

Ric*_*ich 5 python command-line matplotlib python-2.7 theano

我正在研究ML / Theano,最近遇到了这个脚本:https ://gist.github.com/notmatthancock/68d52af2e8cde7fbff1c9225b2790a7f 玩起来很酷。和所有ML研究人员一样,我最近升级到了服务器,虽然功能更强大,但它也给我带来了问题。

该脚本很长,但是以以下代码结尾:

def plot_stuff(inputs, outputs, losses, net_func, n_hidden):
fig,axes = plt.subplots(1,2,figsize=(12,6))

    axes[0].plot(np.arange(losses.shape[0])+1, losses)
    axes[0].set_xlabel('iteration')
    axes[0].set_ylabel('loss')
    axes[0].set_xscale('log')
    axes[0].set_yscale('log')

    x,y = np.mgrid[inputs[:,0].min():inputs[:,0].max():51j, inputs[:,1].min():inputs[:,1].max():51j]
    z = net_func( np.c_[x.flatten(), y.flatten()] ).reshape(x.shape)

    axes[1].contourf(x,y,z, cmap=plt.cm.RdBu, alpha=0.6)
    axes[1].plot(inputs[outputs==0,0], inputs[outputs==0,1], 'or') 
    axes[1].plot(inputs[outputs==1,0], inputs[outputs==1,1], 'sb') 
    axes[1].set_title('Percent missclassified: %0.2f%%' % (((net_func(inputs)>0.5) != outputs.astype(np.bool)).mean()*100))

    fig.suptitle('Shallow net with %d hidden units'%n_hidden)
    plt.show()

if __name__=='__main__':
    n_hidden = 40
    inputs, outputs = gen_data(n_samples_per_class=100)
    losses, net_func = train_neural_network(inputs=inputs, outputs=outputs, n_hidden=n_hidden, n_iters=int(2000), learning_rate=0.1)
    plot_stuff(inputs, outputs, losses, net_func, n_hidden)
Run Code Online (Sandbox Code Playgroud)

生成以下图表:

在此处输入图片说明 当我尝试在服务器上运行它时,它是一个只有命令行而没有屏幕的服务器,我可以预料地收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

有没有一种方法/方法/功能可以在命令行中显示图表和图形?

Nic*_*mer 14

termplotlib (a small project of mine) might come in handy here. Install with

pip3 install termplotlib --user
Run Code Online (Sandbox Code Playgroud)

and produce terminal plots like

pip3 install termplotlib --user
Run Code Online (Sandbox Code Playgroud)
  7 +---------------------------------------------------+
    |                                                   |
  6 |                                             **    |
    |                                           **      |
    |                                         **        |
  5 |                                       **          |
    |                                     ***           |
  4 |                                  ****             |
    |                              *****                |
  3 |             *****************                     |
    |          ****                                     |
  2 |       ***                                         |
    |     ***                                           |
    |   ***                                             |
  1 |  **                                               |
    |**                                                 |
  0 +---------------------------------------------------+
    0      1       2      3       4      5       6      7
Run Code Online (Sandbox Code Playgroud)

  • 很好,不过,它真的必须依赖 gnuplot 吗?安装它需要安装 Qt (363 MB) 和 icu4c (70 MB)。这违背了目的:( (4认同)

Sav*_*omo 14

检查允许使用 python3 在终端上直接绘制数据的包plotext。它非常直观,因为它的使用与matplotlib包非常相似。

这是一个基本示例:

在此处输入图片说明

您可以使用以下命令安装它:

sudo -H pip install plotext
Run Code Online (Sandbox Code Playgroud)

至于 matplotlib,主要功能是scatter(对于单点)、plot(对于由线连接的点)和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)
Run Code Online (Sandbox Code Playgroud)

clear=True里面的选项show用于在绘图前清除终端:这很有用,例如,在绘制连续的数据流时。绘制连续数据流的示例如下所示: 在此处输入图片说明

包描述提供了更多的信息,如何自定义曲线。该软件包已在 Ubuntu 16 上进行了测试,可以完美运行。未来可能的发展(根据要求)可能涉及对 python2 和其他图形界面(例如 jupiter)的扩展。如果您在使用时遇到任何问题,请告诉我。谢谢。

我希望这能解决你的问题。

  • 新版本解决了上述所有错误:-) (2认同)

Wil*_*234 8

我创建了一个名为的小包termplot ,用于从列表中创建垂直条形图。

pip install termplot
Run Code Online (Sandbox Code Playgroud)

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])
Run Code Online (Sandbox Code Playgroud)

图片


小智 8

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

得益于 Unicode,与其他终端绘图仪相比,分辨率提高了 4 倍。

在此处输入图片说明

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


Ash*_*Ash 7

在我看来,terminalplot比@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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • Terminalplot 的最后一次提交是在 2016 年。 [asciiplotlib](https://github.com/nschloe/asciiplotlib) 似乎得到了更积极的维护 (2认同)

小智 6

您可以在此处选择两个选项:

  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')
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您的服务器支持X11转发(或者您可以启用/安装X11转发),则可以通过设置显示方式SSH进入服务器。在linux上,运行:

    DISPLAY=:0.0 ssh -Y <server ip>
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 没有办法在终端中显示图形吗? (3认同)

Jay*_*Jay 6

如果你想用图表弹出一个外部窗口,运行绘图,然后

>>> matplotlib.pyplot.show(block=True)

这将在单独的窗口中弹出图表。

如果您plot()在此调用之前多次调用,它将弹出相同数量的带有相应图表的窗口。只有当您关闭所有弹出的图表窗口时,控制才会返回给 Python。

我喜欢将它包装在一个小辅助函数中,如下所示:

def show():
   return matplotlib.pyplot.show(block=True) 
Run Code Online (Sandbox Code Playgroud)

然后我只要show()想看任何尚未显示的情节就打电话。


dur*_*rum 6

可以在终端和终端模拟器中绘制光栅图像:

import matplotlib
matplotlib.use('module://matplotlib-sixel')
from pylab import *
plt.plot(sin(arange(100) / 10))
show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

此特定示例使用matplotlib-sixel,这是一个使用 Xterm 模拟Sixel兼容终端和 ImageTrick 的库。类似的技术可以在 Linux 终端(通过Framebuffer)或模拟器(kittyiTerm2)中实现。FOSS 社区在过去几年中提供了很好的解决方案(如libsixel)。

另一种选择是使用X11 转发或使用基于 Sixel 的打印机,如lsix。但是所有这些选项都发生在 Python shell 本身之外。

当然,在服务器中运行Jupyter Notebook可能比在终端中硬塞一个图像更好。这可能不值得。