How to plot a chart in the terminal?

有些话、适合烂在心里 提交于 2019-12-01 03:54:03

问题


I'm researching ML/Theano, and recently came across this script: https://gist.github.com/notmatthancock/68d52af2e8cde7fbff1c9225b2790a7f which was cool to play with. And like all ML researchers, I recently upgraded to a server, and while it's more powerful, it also presented me with a problem.

The script is very long, but it ends with this code:

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) 

Which generates this chart:

And when I tried to run it on the server, which being a sever has no screen only a command line, I predictably got this error:

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 

Is there a way/method/function to display charts and graphs in the command line?


回答1:


You have a couple of options here:

  1. Export to image or PDF. Information found here: http://matplotlib.org/faq/howto_faq.html The key piece of information here is below:

    # 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. If your server supports X11 forwarding (or if you can enable/install X11 forwarding), you can SSH into the server by setting your display. From linux, run:

    DISPLAY=:0.0 ssh -Y <server ip> 

    This will set up your machine to forward any display output from the server to your PC. If you are running Windows, you can use MobaXterm which makes it easy, or configure an X11 client yourself. Mac is similarly easy if I remember correctly.




回答2:


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

pip3 install termplotlib --user 

and produce terminal plots like

import termplotlib as tpl import numpy as np  x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) + x fig = tpl.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:


I created a small package called termplot that creates a vertical bar plot from a list.

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




回答4:


If you want to pop an external window with the chart, run the plot and then

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

This will pop the chart in a separate window.

If you call plot() several times prior to this call, it will then pop an equal amount of windows with the respective charts. Control returns to Python only when you close all popped chart windows.

I like to wrap it in a little helper function, like so:

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

Then I just call show() whenever I want to see any yet unshown plots.




回答5:


It seems to me that terminalplot, which is much more complete than the package suggested by @William234234 might be a good solution.

Example usage:

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) 



来源:https://stackoverflow.com/questions/37288421/how-to-plot-a-chart-in-the-terminal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!