Outil de création de graphiques/traceurs Unix ASCII en ligne de commande


92

Existe-t-il un bon outil de création de graphiques, de graphiques et de traçage UNIX? Je cherche quelque chose qui tracera xy points sur un graphique ASCII.

Juste pour clarifier les choses, je suis à la recherche de quelque chose qui va afficher un graphique en ASCII (comme le style ascii-art), donc je peux l'utiliser au cours d'une session shell interactif sans avoir besoin X.

  0

Vote pour fermer en tant qu'outil rec. 07 oct.. 152015-10-07 15:16:18

96

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

Il peut émettre à 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 
+4

Battez-moi au coup de poing. Suppression de mon doublon 23 sept.. 082008-09-23 19:58:00

  0

Que signifie le message 'options are feed 79 24''? Est-ce la hauteur et la largeur? Pouvez-vous développer votre exemple pour les définir? 11 mai. 162016-05-11 13:02:16

+1

@einpoklum: C'est la taille par défaut de l'intrigue, qui fait référence à vga nr de colonnes et de lignes de caractères. (Recherche muette dans le docx de gnuplot) 05 juin. 172017-06-05 08:14:53


2

Une solution très lourde et accablée serait d'installer et d'utiliser cernlibpaw.

  0

-1 pour me donner des souvenirs de l'école de diplômé :) 14 août. 132013-08-14 00:22:31

+4

... il semble que @MarkLakata n'a pas réellement -1. 11 mai. 162016-05-11 13:05:27


6

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

Personnellement, je suis également un grand fan du google chart API, qui peut être consulté à partir de la ligne de commande à l'aide de wget (ou curl) pour télécharger un fichier png (et afficher avec xview ou quelque chose de similaire). J'aime cette option parce que je trouve que les graphiques sont légèrement plus jolis (c'est-à-dire que l'antialiasing est meilleur).

  0

L '[API Google Image Charts] (https://developers.google.com/chart/image/docs/making_charts) est obsolète, mais incroyable. 21 mai. 152015-05-21 17:30:25


3

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 terme muet 64 10 » puis « le péché de la parcelle (x) »:

 

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


Il semble mieux 79x24 (ne pas utiliser la 80e colonne sur une Affichage 80x24: certaines implémentations 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.


51

Alors que gnuplot est puissant, il est aussi très irritant quand vous voulez juste pipe dans un tas de points et obtenir un graphique.

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

Il ne semble pas avoir l'option de forcer les graphiques terminaux; Je patché comme si:

--- 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"[email protected]["MiscOptions"] 
       com=com+"set multiplot;\n" if doMultiPlot 
+    com=com+"set terminal dumb;\n" 
       com=com+"plot "[email protected]["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 
  0

Exactement ce que je voulais - piping to gnuplot! 07 déc.. 122012-12-07 06:18:33

  0

Est-ce qu'eplot a encore besoin de ce patch? 11 mai. 162016-05-11 13:03:16

  0

[La dernière version] (http://liris.cnrs.fr/christian.wolf/software/eplot/index.html#download) a été publié en 2007, alors oui. Un meilleur correctif qui pourrait être libéré impliquerait d'ajouter un autre drapeau et de conditionner le comportement, mais je n'ai pas encore voulu faire l'effort de le faire. 12 mai. 162016-05-12 00:03:46

+2

J'ai mis une fourchette d'eplot sur github avec le patch suggéré dans ce fil, et j'ai ajouté l'affichage d'image en ligne iTerm2. https://github.com/dandavison/eplot 18 mars. 172017-03-18 20:44:54

+1

J'ai envoyé un patch à Christian Wolf, le créateur d'eplot, et il l'a accepté. Nouveau repo sur github: https://github.com/chriswolfvision/eplot 25 juil.. 172017-07-25 18:50:20


21

Une autre option que j'ai couru juste en face est bashplotlib. Voici un exemple exécuté sur (à peu près) les mêmes données que my eplot example:

[$]> 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| 
----------------------- 

Réglage des bacs aide la résolution un peu:

[$]> 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 
    -------------------------------------------------------------------------------- 

14

Parcelles en une seule ligne sont très simples, et peut aider un voir modèles de hauts et de bas. Voir aussi pysparklines.
(Est-ce que quelqu'un sait de lignes unicode, obliques qui pourraient être emboîtables pour faire la ligne , pas un bar, des parcelles?)

#!/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) 

11

feedgnuplot est une autre extrémité avant de gnuplot, qui gère la tuyauterie dans les 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 
  0

Comment cela se compare-t-il à 'eplot', suggéré dans une autre réponse? 11 mai. 162016-05-11 13:05:06


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 -T pour obtenir ASCII graphiques résultat au lieu d'une fenêtre de gnuplot.