Outil de traçage / graphique basé sur Unix ASCII en ligne de commande

139

Existe-t-il un bon outil de création de graphiques / graphiques / tracés UNIX en ligne de commande? Je cherche quelque chose qui tracera des points xy sur un graphique ASCII.

Juste pour clarifier, je recherche quelque chose qui produira un graphique en ASCII (comme le style ascii-art), afin que je puisse l'utiliser sur une session shell interactive sans avoir besoin de X.

bajafresh4life
la source
3
Voter pour fermer comme outil rec.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Jetez également un œil à ma réponse .
not2qubit

Réponses:

132

Essayez gnuplot . Il a des possibilités graphiques très puissantes.

Il peut sortir sur votre terminal de la manière suivante:

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
Palmin
la source
1
Que signifie le options are feed 79 24'message? Est-ce que c'est hauteur et largeur? Pouvez-vous élargir votre exemple pour les définir?
einpoklum
3
@einpoklum: C'est la taille par défaut du tracé, qui fait référence au vga nr de colonnes et de lignes de caractères. (Lookup dumb in the gnuplot docx)
Emile Vrijdags
64

Bien que ce gnuplotsoit puissant, c'est aussi très irritant lorsque vous voulez simplement insérer un tas de points et obtenir un graphique.

Heureusement, quelqu'un a créé eplot (easy plot), qui gère toutes les absurdités pour vous.

Il ne semble pas avoir d'option pour forcer les graphes terminaux; Je l'ai patché comme ceci:

--- 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 exemple d'utilisation:

[$]> 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
Xiong Chiamiov
la source
Exactement ce que je voulais - passer à gnuplot!
Lionel
1
Eplot a-t-il toujours besoin de ce patch?
einpoklum
La dernière version est sortie en 2007, donc oui. Un meilleur correctif qui pourrait effectivement être publié impliquerait d'ajouter un autre indicateur et de conditionner le comportement, mais je n'ai pas encore voulu faire l'effort de le faire.
Xiong Chiamiov
2
J'ai mis un fork d'eplot sur github avec le patch suggéré dans ce fil, et j'ai également ajouté l'affichage d'image en ligne iTerm2. github.com/dandavison/eplot
ded7
9
J'ai envoyé à Christian Wolf, le créateur d'eplot, un patch et il l'a accepté. Nouveau dépôt
pdbj
25

Une autre option que je viens de rencontrer est bashplotlib . Voici un exemple exécuté sur (à peu près) les mêmes données que mon exemple 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|
-----------------------

L'ajustement des bacs aide un peu la résolution:

[$]> 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
    --------------------------------------------------------------------------------
Xiong Chiamiov
la source
18

Les tracés sur une seule ligne sont vraiment simples et peuvent aider à voir les modèles de hauts et de bas.
Voir aussi pysparklines .
(Est-ce que quelqu'un connaît des lignes inclinées Unicode, qui pourraient être assemblées pour créer des lignes, pas des barres, des tracés?)

#!/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 )
denis
la source
17

feedgnuplot est un autre frontal de gnuplot, qui gère la canalisation des données.

    $ 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
mc0e
la source
Comment cela se compare-t-il avec eplot, suggéré dans une autre réponse?
einpoklum
13

Voir aussi: asciichart (implémenté dans Node.js, Python, Java, Go et Haskell)

entrez la description de l'image ici

Igor Kroitor
la source
6

gnuplot est la réponse définitive à votre question.

Personnellement, je suis également un grand fan de l' API google chart , accessible depuis la ligne de commande à l'aide de wget (ou curl) pour télécharger un fichier png (et le visualiser avec xview ou quelque chose de similaire). J'aime cette option car je trouve les graphiques un peu plus jolis (c'est-à-dire un meilleur anticrénelage).

Tyler
la source
1
L' API Google Image Charts est obsolète, mais incroyable.
bonh
5

Vous devez utiliser gnuplot et assurez-vous de lancer la commande "set term dumb" après le démarrage. Vous pouvez également donner un nombre de lignes et de colonnes. Voici la sortie de gnuplot si vous émettez "set term dumb 64 ​​10" puis "plot sin (x)":

 

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


Il semble mieux en 79x24 (n'utilisez pas la 80ème colonne sur un écran 80x24: certaines implémentations de curses ne se comportent pas toujours bien autour de la dernière colonne).

J'utilise gnuplot v4, mais cela devrait fonctionner sur des versions légèrement plus anciennes ou plus récentes.

Thomas Kammeyer
la source
4

Une autre alternative plus simple / plus légère à gnuplot est ervy , un outil de tableaux de terminaux basé sur NodeJS.

Types pris en charge: dispersion (points XY), barre, tarte, puce, anneau et jauge.

Des exemples d'utilisation avec diverses options peuvent être trouvés sur le dépôt GitHub des projets

entrez la description de l'image ici

entrez la description de l'image ici

Daniel Korn
la source
3

Vérifiez le package plotext qui permet de tracer les données directement sur le terminal en utilisant python3. Il est très intuitif car son utilisation est très similaire au paquet matplotlib .

Voici un exemple de base:

entrez la description de l'image ici

Vous pouvez l'installer avec la commande suivante:

sudo -H pip install plotext

Comme pour matplotlib, les principales fonctions sont scatter (pour les points uniques), plot (pour les points joints par des lignes) et show (pour imprimer réellement le tracé sur le terminal). Il est facile de spécifier les dimensions du tracé, les styles de point et de ligne, etc. pour afficher les axes, les graduations numériques et les équations finales, qui sont utilisés pour convertir les coordonnées tracées en valeurs réelles d'origine.

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 = 17, cols = 70)
plx.show(clear = 0)

L'option à l' clear=Trueintérieurshow est utilisée pour effacer le terminal avant le traçage: c'est utile, par exemple, lors du traçage d'un flux continu de données. Un exemple de traçage d'un flux de données continu est présenté ici: entrez la description de l'image ici

le description du package fournit plus d'informations sur la personnalisation du tracé. Le package a été testé sur Ubuntu 16 où il fonctionne parfaitement. Les développements futurs possibles (sur demande) pourraient impliquer l'extension de python2 et d'autres interfaces graphiques (par exemple Jupiter). Veuillez me faire savoir si vous rencontrez des problèmes lors de son utilisation. Merci.

J'espère que cela répond à votre problème.

Savino Piccolomo
la source
2

De plus, spark est un joli petit graphique à barres dans votre shell.

zdk
la source
1

Voici mon patch pour eplot qui ajoute une option -T pour la sortie du terminal:

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

En utilisant cela, vous pouvez l'exécuter comme eplot -Tpour obtenir un résultat graphique ASCII au lieu d'une fenêtre gnuplot.

Max Kosyakov
la source
1
eplot a maintenant cette fonction intégrée avec -d
Max