Strumento per grafici / grafici Unix basato su ASCII da riga di comando


139

Esiste un buon strumento per la creazione di grafici / grafici / grafici UNIX da riga di comando? Sto cercando qualcosa che traccia i punti xy su un grafico ASCII.

Giusto per chiarire, sto cercando qualcosa che produrrà un grafico in ASCII (come lo stile ascii-art), quindi posso usarlo su una sessione di shell interattiva senza bisogno di X.


3
Votare per chiudere come strumento rec.
Ciro Santilli 7 冠状 病 六四 事件 法轮功

Dai anche un'occhiata alla mia risposta .
not2qubit

Risposte:


132

Prova gnuplot . Ha possibilità grafiche molto potenti.

Può essere inviato al tuo terminale nel modo seguente:

gnuplot> set terminal dumb
Terminal type set to 'dumb'
Options are 'feed 79 24'
gnuplot> plot sin(x)

   1 ++----------------**---------------+----**-----------+--------**-----++
     +                *+ *              +   *  *          +  sin(x) ****** +
 0.8 ++              *    *                *    *                *    *   ++
     |               *    *                *    *                *    *    |
 0.6 ++              *     *              *      *              *      *  ++
     *              *       *             *       *             *      *   |
 0.4 +*             *       *             *       *             *      *  ++
     |*            *        *            *        *            *        *  |
 0.2 +*            *        *            *        *            *        * ++
     | *          *          *          *          *          *          * |
   0 ++*          *          *          *          *          *          *++
     |  *         *           *         *           *         *           *|
-0.2 ++ *         *           *         *           *         *           *+
     |   *       *            *        *            *        *            *|
-0.4 ++  *       *            *        *            *        *            *+
     |   *      *              *      *              *      *              *
-0.6 ++  *      *              *      *              *      *             ++
     |    *     *               *     *               *    *               |
-0.8 ++    *   *                 *   *                *    *              ++
     +     *  *        +         *  *   +              *  *                +
  -1 ++-----**---------+----------**----+---------------**+---------------++
    -10               -5                0                 5                10

1
Cosa significa il options are feed 79 24'messaggio? Quella è altezza e larghezza? Puoi espandere il tuo esempio per impostarli?
einpoklum,

3
@einpoklum: questa è la dimensione predefinita della trama, che si riferisce alla vga nr di colonne e linee di caratteri. (Ricerca stupida nel gnuplot docx)
Emile Vrijdags,

64

Anche se gnuplotè potente, è anche molto irritante quando vuoi solo inserire un mucchio di punti e ottenere un grafico.

Per fortuna, qualcuno ha creato eplot (trama semplice), che gestisce tutte le sciocchezze per te.

Non sembra avere un'opzione per forzare i grafici dei terminali; L'ho patchato così:

--- eplot.orig  2012-10-12 17:07:35.000000000 -0700
+++ eplot       2012-10-12 17:09:06.000000000 -0700
@@ -377,6 +377,7 @@
                # ---- print the options
                com="echo '\n"+getStyleString+@oc["MiscOptions"]
                com=com+"set multiplot;\n" if doMultiPlot
+               com=com+"set terminal dumb;\n"
                com=com+"plot "+@oc["Range"]+comString+"\n'| gnuplot -persist"
                printAndRun(com)
                # ---- convert to PDF

Un esempio di utilizzo:

[$]> git shortlog -s -n | awk '{print $1}' | eplot 2> /dev/null


  3500 ++-------+-------+--------+--------+-------+--------+-------+-------++
       +        +       +        "/tmp/eplot20121012-19078-fw3txm-0" ****** +       *                                                                    |  3000 +*                                                                  ++       |*                                                                   |       | *                                                                  |  2500 ++*                                                                 ++       | *                                                                  |
       |  *                                                                 |
  2000 ++ *                                                                ++
       |  **                                                                |
  1500 ++   ****                                                           ++
       |        *                                                           |
       |         **                                                         |
  1000 ++          *                                                       ++
       |            *                                                       |
       |            *                                                       |
   500 ++            ***                                                   ++
       |                **************                                      |
       +        +       +        +    **********  +        +       +        +
     0 ++-------+-------+--------+--------+-----***************************++
       0        5       10       15       20      25       30      35       40

Esattamente quello che volevo: fare il piping su gnuplot!
Lionel,

1
Eplot ha ancora bisogno di quella patch?
einpoklum,

L'ultima versione è stata rilasciata nel 2007, quindi sì. Una patch migliore che potrebbe effettivamente essere rilasciata implicherebbe l'aggiunta di un'altra bandiera e il condizionamento del comportamento, ma non ho ancora voluto impegnarmi per farlo.
Xiong Chiamiov,

2
Ho messo un fork di eplot su github con la patch suggerita in questo thread e ho anche aggiunto la visualizzazione dell'immagine in linea iTerm2. github.com/dandavison/eplot
ded7

9
Ho inviato a Christian Wolf, il creatore di Eplot, una patch e l'ha accettata. Nuovo repository su github: github.com/chriswolfvision/eplot
pdbj

25

Un'altra opzione che ho appena incontrato è bashplotlib . Ecco un esempio eseguito su (approssimativamente) gli stessi dati del mio esempio di eplot :

[$]> git shortlog -s -n | awk '{print $1}' | hist

 33|   o
 32|   o
 30|   o
 28|   o
 27|   o
 25|   o
 23|   o
 22|   o
 20|   o
 18|   o
 16|   o
 15|   o
 13|   o
 11|   o
 10|   o
  8|   o
  6|   o
  5|   o
  3|   o o     o
  1|   o o     o o       o
  0|   o o o o o o       o
    ----------------------

-----------------------
|       Summary       |
-----------------------
|   observations: 50  |
| min value: 1.000000 |
|  mean : 519.140000  |
|max value: 3207.000000|
-----------------------

La regolazione dei cassonetti aiuta un po 'la risoluzione:

[$]> git shortlog -s -n | awk '{print $1}' | hist --nosummary --bins=40

 18|   o
   |   o
 17|   o
 16|   o
 15|   o
 14|   o
 13|   o
 12|   o
 11|   o
 10|   o
  9|   o
  8|   o
  7|   o
  6|   o
  5|   o   o
  4|   o   o o
  3|   o o o o   o
  2|   o o o o   o
  1|   o o o o   o                     o       o
  0|   o o o o o o           o     o   o o   o o                                 o
   |   o o o o o o           o     o   o o   o o                                 o
    --------------------------------------------------------------------------------

18

I grafici in una sola riga sono davvero semplici e possono aiutare a vedere schemi di alti e bassi.
Vedi anche pysparklines .
(Qualcuno sa di linee inclinate unicode, che potrebbero essere adattate insieme per creare linee, non barre, grafici?)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import division
import numpy as np

__version__ = "2015-01-02 jan  denis"


#...............................................................................
def onelineplot( x, chars=u"▁▂▃▄▅▆▇█", sep=" " ):
    """ numbers -> v simple one-line plots like

f ▆ ▁ ▁ ▁ █ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁  osc 47  ▄ ▁ █ ▇ ▄ ▆ ▅ ▇ ▇ ▇ ▇ ▇ ▄ ▃ ▃ ▁ ▃ ▂  rosenbrock
f █ ▅ █ ▅ █ ▅ █ ▅ █ ▅ █ ▅ █ ▅ █ ▅ ▁ ▁ ▁ ▁  osc 58  ▂ ▁ ▃ ▂ ▄ ▃ ▅ ▄ ▆ ▅ ▇ ▆ █ ▇ ▇ ▃ ▃ ▇  rastrigin
f █ █ █ █ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁ ▁  osc 90  █ ▇ ▇ ▁ █ ▇ █ ▇ █ ▇ █ ▇ █ ▇ █ ▇ █ ▇  ackley

Usage:
    astring = onelineplot( numbers [optional chars= sep= ])
In:
    x: a list / tuple / numpy 1d array of numbers
    chars: plot characters, default the 8 Unicode bars above
    sep: "" or " " between plot chars

How it works:
    linscale x  ->  ints 0 1 2 3 ...  ->  chars ▁ ▂ ▃ ▄ ...

See also: https://github.com/RedKrieg/pysparklines
    """

    xlin = _linscale( x, to=[-.49, len(chars) - 1 + .49 ])
        # or quartiles 0 - 25 - 50 - 75 - 100
    xints = xlin.round().astype(int)
    assert xints.ndim == 1, xints.shape  # todo: 2d
    return sep.join([ chars[j] for j in xints ])


def _linscale( x, from_=None, to=[0,1] ):
    """ scale x from_ -> to, default min, max -> 0, 1 """
    x = np.asanyarray(x)
    m, M = from_ if from_ is not None \
        else [np.nanmin(x), np.nanmax(x)]
    if m == M:
        return np.ones_like(x) * np.mean( to )
    return (x - m) * (to[1] - to[0]) \
        / (M - m)  + to[0]


#...............................................................................
if __name__ == "__main__":  # standalone test --
    import sys

    if len(sys.argv) > 1:  # numbers on the command line, may be $(cat myfile)
        x = map( float, sys.argv[1:] )
    else:
        np.random.seed( 0 )
        x = np.random.exponential( size=20 )

    print onelineplot( x )

17

feedgnuplot è un altro front-end di gnuplot, che gestisce il piping nei dati.

    $ seq 5 | awk '{print 2*$1, $1*$1}' |
      feedgnuplot --lines --points --legend 0 "data 0" --title "Test plot" --y2 1
                  --terminal 'dumb 80,40' --exit

                                     Test plot

     10 ++------+--------+-------+-------+-------+--------+-------+------*A 25
        +       +        +       +       +       +        +       +    **#+
        |       :        :       :       :       :        : data 0+**A*** |
        |       :        :       :       :       :        :       :** #   |
      9 ++.......................................................**.##....|
        |       :        :       :       :       :        :    ** :#      |
        |       :        :       :       :       :        :  **   #       |
        |       :        :       :       :       :        :**   ##:      ++ 20
      8 ++................................................A....#..........|
        |       :        :       :       :       :      **:   #   :       |
        |       :        :       :       :       :    **  : ##    :       |
        |       :        :       :       :       :  **    :#      :       |
        |       :        :       :       :       :**      B       :       |
      7 ++......................................**......##................|
        |       :        :       :       :    ** :    ##  :       :      ++ 15
        |       :        :       :       :  **   :   #    :       :       |
        |       :        :       :       :**     : ##     :       :       |
      6 ++..............................*A.......##.......................|
        |       :        :       :    ** :     ##:        :       :       |
        |       :        :       :  **   :    #  :        :       :       |
        |       :        :       :**     :  ##   :        :       :      ++ 10
      5 ++......................**........##..............................|
        |       :        :    ** :      #B       :        :       :       |
        |       :        :  **   :    ## :       :        :       :       |
        |       :        :**     :  ##   :       :        :       :       |
      4 ++...............A.......###......................................|
        |       :      **:     ##:       :       :        :       :       |
        |       :    **  :   ##  :       :       :        :       :      ++ 5
        |       :  **    : ##    :       :       :        :       :       |
        |       :**    ##B#      :       :       :        :       :       |
      3 ++.....**..####...................................................|
        |    **####      :       :       :       :        :       :       |
        |  **## :        :       :       :       :        :       :       |
        B**     +        +       +       +       +        +       +       +
      2 A+------+--------+-------+-------+-------+--------+-------+------++ 0
        1      1.5       2      2.5      3      3.5       4      4.5      5

Come si confronta questo eplot, suggerito in un'altra risposta?
einpoklum,


6

gnuplot è la risposta definitiva alla tua domanda.

Personalmente sono anche un grande fan dell'API di Google Chart , a cui è possibile accedere dalla riga di comando con l'aiuto di wget (o curl) per scaricare un file png (e visualizzare con xview o qualcosa di simile). Mi piace questa opzione perché trovo i grafici leggermente più carini (ovvero un migliore antialiasing).


1
L' API Google Image Charts è obsoleta, ma sorprendente.
bonh,

5

Dovresti usare gnuplot ed essere sicuro di emettere il comando "imposta termine stupido" dopo l'avvio. Puoi anche dare un conteggio di righe e colonne. Ecco l'output di gnuplot se si emette "set term dumb 64 ​​10" e quindi "plot sin (x)":

 

    1 ++ ----------- **** ----------- + - *** ------- + ------ * *** - ++
  0.6 * + ** + * + ** * sin (x) ******* ++
  0,2 + * * * ** ** * ** ++
    0 ++ * ** * ** * ** * ++
 -0,4 ++ ** * ** ** * * * +
 -0,8 ++ ** * + * ** + * + ** + *
   -1 ++ - **** ------ + ------- *** --- + ---------- **** ----- ------ ++
     -10 -5 0 5 10


Sembra migliore a 79x24 (non usare l'80a colonna su un display 80x24: alcune implementazioni di maledizioni non sempre si comportano bene attorno all'ultima colonna).

Sto usando gnuplot v4, ma questo dovrebbe funzionare su versioni leggermente più vecchie o più recenti.


4

Un'altra alternativa più semplice / leggera a gnuplot è ervy , uno strumento di grafici terminali basato su NodeJS.

Tipi supportati: scatter (punti XY), barra, torta, proiettile, ciambella e manometro.

Esempi di utilizzo con varie opzioni sono disponibili nel repository GitHub dei progetti

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


3

Controlla il plotext del pacchetto che consente di tracciare i dati direttamente sul terminale usando python3. È molto intuitivo in quanto il suo utilizzo è molto simile al pacchetto matplotlib .

Ecco un esempio di base:

inserisci qui la descrizione dell'immagine

Puoi installarlo con il seguente comando:

sudo -H pip install plotext

Per quanto riguarda matplotlib, le funzioni principali sono scatter (per punti singoli), trama (per punti uniti da linee) e mostra (per stampare effettivamente la trama sul terminale). È facile specificare le dimensioni del grafico, gli stili di punto e linea e qualsiasi cosa mostri gli assi, i segni di spunta numerici e le equazioni finali, che vengono utilizzati per convertire le coordinate tracciate nei valori reali originali.

Ecco il codice per produrre la trama mostrata sopra:

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)

L'opzione clear=Trueinterna showviene utilizzata per cancellare il terminale prima della stampa: questo è utile, ad esempio, quando si stampa un flusso continuo di dati. Un esempio di tracciare un flusso di dati continuo è mostrato qui: inserisci qui la descrizione dell'immagine

La descrizione del pacchetto fornisce ulteriori informazioni su come personalizzare la trama. Il pacchetto è stato testato su Ubuntu 16 dove funziona perfettamente. Eventuali sviluppi futuri (su richiesta) potrebbero comportare l'estensione a python2 e ad altre interfacce grafiche (ad es. Jupiter). Per favore fatemi sapere se avete problemi ad usarlo. Grazie.

Spero che questo risponda al tuo problema.


2

Inoltre, spark è un piccolo grafico a barre nella shell.


1

Ecco la mia patch per eplot che aggiunge un'opzione -T per l'output del terminale:

--- eplot       2008-07-09 16:50:04.000000000 -0400
+++ eplot+      2017-02-02 13:20:23.551353793 -0500
@@ -172,7 +172,10 @@
                                        com=com+"set terminal postscript color;\n"
                                        @o["DoPDF"]=true

-                               # ---- Specify a custom output file
+                               when /^-T$|^--terminal$/
+                                       com=com+"set terminal dumb;\n"
+
+                                # ---- Specify a custom output file
                                when /^-o$|^--output$/
                                        @o["OutputFileSpecified"]=checkOptArg(xargv,i)
                                        i=i+1

                                    i=i+1

Usandolo puoi eseguirlo come eplot -Tper ottenere un risultato grafico ASCII invece di una finestra di gnuplot.


1
eplot ora ha questo built-in con-d
Max
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.