web-dev-qa-db-fra.com

Comment tracer un graphique dans le terminal?

Je fais des recherches sur ML/Theano et j'ai récemment rencontré ce script: https://Gist.github.com/notmatthancock/68d52af2e8cde7fbff1c9225b2790a7f qui était cool à jouer. Et comme tous les chercheurs ML, j'ai récemment mis à niveau vers un serveur, et bien qu'il soit plus puissant, il m'a également posé un problème.

Le script est très long, mais il se termine par ce 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)

Qui génère ce graphique:

enter image description here Et quand j'ai essayé de l'exécuter sur le serveur, qui étant un serveur n'a pas d'écran seulement une ligne de commande, j'ai prévisible cette erreur:

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

Existe-t-il un moyen/une méthode/une fonction pour afficher des tableaux et des graphiques dans la ligne de commande?

7
Rich

Vous avez quelques options ici:

  1. Exporter en image ou PDF. Informations trouvées ici: http://matplotlib.org/faq/howto_faq.html Les informations clés ici sont ci-dessous:

    # 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. Si votre serveur prend en charge le transfert X11 (ou si vous pouvez activer/installer le transfert X11), vous pouvez SSH sur le serveur en définissant votre affichage. Depuis Linux, exécutez:

    DISPLAY=:0.0 ssh -Y <server ip>
    

    Cela configurera votre machine pour transmettre toute sortie d'affichage du serveur à votre PC. Si vous exécutez Windows, vous pouvez utiliser MobaXterm, ce qui facilite la tâche, ou configurer vous-même un client X11. Mac est également facile si je me souviens bien.

7
Sagnik Ghosh

termplotlib (un petit projet à moi) pourrait être utile ici. Installer avec

pip3 install termplotlib

et produire des parcelles terminales comme

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
20
Nico Schlömer

J'ai créé un petit paquet appelé termplot qui crée un graphique à barres verticales à partir d'une liste.

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

5
William234234

Si vous souhaitez ouvrir une fenêtre externe avec le graphique, exécutez le tracé, puis

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

Cela fera apparaître le graphique dans une fenêtre séparée.

Si vous appelez plot() plusieurs fois avant cet appel, il affichera alors un nombre égal de fenêtres avec les graphiques respectifs. Le contrôle revient à Python uniquement lorsque vous fermez toutes les fenêtres de graphique éclatées.

J'aime l'envelopper dans une petite fonction d'aide, comme ceci:

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

Ensuite, j'appelle simplement show() chaque fois que je veux voir des tracés non encore affichés.

3
Jay

Il me semble que terminalplot , qui est beaucoup plus complet que le package suggéré par @ William234234 pourrait être une bonne solution.

Exemple d'utilisation:

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

2
Ash

Vérifiez le package plotext qui permet de tracer les données directement sur le terminal en utilisant python3.

Voici un exemple de base:

       •••••                                                                 │  
     •••   ••                                                                ├15
    ••      ••                                                               │  
    •        ••                                                              │  
   ••         ••                                                             │  
  ••           ••                            •••••                           │  
  •             ••                        ••••   ••••                        ├10
 ••              •                       ••         •••                      │  
 •               ••                    •••            ••                     │  
••                ••                  ••               •••                   │  
•                  ••                ••                  •••              •••│  
                    ••              ••                     •••         ••••  ├5 
                     •             ••                        •••••••••••     │  
                     ••          •••                                         │  
                       ••       ••                                           │  
                        ••    •••                                            │  
                         ••••••                                              ├0 
┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬──────┘  
0         10        20        30        40        50        60        70        
x = 39.461 × x-axis - 0.000 ± 19.730                                            
y =  0.087 × y-axis - 0.559 ±  0.043 

Vous pouvez l'installer avec la commande suivante:

Sudo -H pip3 install plotext

Voici le code pour produire le graphique ci-dessus:

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 = 20, cols = 100, equations = True, point_color = 'blue')
plx.show(clear = 0)
1
Savino Piccolomo