如何在终端中绘制图表?

问题描述 投票:2回答:5

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

这会生成此图表:

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

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

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

python python-2.7 matplotlib command-line theano
5个回答
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也同样容易。

6
投票

asciiplotlib(我的一个小项目)可能在这里派上用场。安装时

pip3 install asciiplotlib --user

并产生类似的终端图

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
投票

我创建了一个名为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])


2
投票

如果要使用图表弹出外部窗口,请运行绘图然后

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

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

如果你在此次通话之前多次拨打plot(),它将会弹出相同数量的窗口和相应的图表。只有在关闭所有弹出的图表窗口时,Control才会返回到Python。

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

def show():
   return matplotlib.pyplot.show(block=True) 

然后,只要我想看到任何未示出的情节,我就会打电话给show()


1
投票

在我看来,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)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.