Befehlszeile Unix ASCII-basiertes Charting-/Plotting-Tool


92

Gibt es ein gutes Befehlszeilenprogramm für UNIX-Diagramme/Grafiken/Plotting? Ich suche nach etwas, das xy-Punkte in einem ASCII-Graphen darstellt.

Nur um zu klären, ich bin für etwas, das eine grafische Darstellung in ASCII ausgegeben (wie ascii-Art-Stil), so kann ich es über eine interaktive Shell-Sitzung verwenden, ohne X. zu benötigen

  0

Abstimmung zum Schließen als Werkzeug rec. 07 okt. 152015-10-07 15:16:18

96

gnuplot Versuchen. Es hat sehr mächtige Grafikmöglichkeiten.

Es kann Ausgabe an Ihrem Terminal auf folgende Weise:

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

Beat mich bis zum Schlag. Löschen meines Duplikats 23 sep. 082008-09-23 19:58:00

  0

Was bedeuten die 'options feed 79 24'' message mean? Ist das Höhe und Breite? Können Sie Ihr Beispiel erweitern, um sie festzulegen? 11 mai. 162016-05-11 13:02:16

+1

@einpoklum: Dies ist die Standardgröße des Plots, die sich auf vga nr von Zeichenspalten und -zeilen bezieht. (Lookup dumm in der gnuplot docx) 05 jun. 172017-06-05 08:14:53


2

Eine sehr schwere und überwältigt Lösung wäre cernlib zu installieren und paw zu verwenden.

  0

-1 für geben mir Erinnerungen an die Schule :) 14 aug. 132013-08-14 00:22:31

+4

... es scheint @MarkLakata tatsächlich -1 nicht. 11 mai. 162016-05-11 13:05:27


6

gnuplot ist die definitive Antwort auf Ihre Frage.

Ich bin persönlich auch ein großer Fan der google chart API, die von der Befehlszeile mit Hilfe von wget (oder curl) zugegriffen werden kann, um eine PNG-Datei herunterzuladen (und mit xview oder etwas ähnliches anzeigen). Ich mag diese Option, weil ich finde, dass die Diagramme etwas hübscher sind (d. H. Besseres Antialiasing).

  0

Die [Google Image Charts API] (https://developers.google.com/chart/image/docs/making_charts) ist veraltet, aber erstaunlich. 21 mai. 152015-05-21 17:30:25


3

Sie sollten gnuplot verwenden und sicherstellen, dass nach dem Start der Befehl "set term dumm" ausgegeben wird. Sie können auch eine Zeilen- und Spaltenanzahl angeben. Hier ist die Ausgabe von gnuplot, wenn Sie „gesetzt Begriff stumm 64 10“ und dann „plot sin (x)“ Ausgabe:

 

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


Es sieht besser auf 79x24 (nicht die 80. Spalte auf einer Verwendung 80x24-Anzeige: Einige Curses-Implementierungen verhalten sich in der letzten Spalte nicht immer gut).

Ich benutze gnuplot v4, aber das sollte auf etwas älteren oder neueren Versionen arbeiten.


51

Während gnuplot ist mächtig, es ist auch wirklich irritierend, wenn Sie nur eine Reihe von Punkten introsen und ein Diagramm erhalten möchten.

Glücklicherweise erstellt jemand eplot (easy plot), die den ganzen Unsinn für Sie behandelt.

Es scheint keine Option zu haben, terminale Graphen zu erzwingen; Ich gepatcht es etwa so:

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

Ein Anwendungsbeispiel:

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

Genau das, was ich wollte - Piping zu gnuplot! 07 dez. 122012-12-07 06:18:33

  0

Braucht eplot diesen Patch noch? 11 mai. 162016-05-11 13:03:16

  0

[Die neueste Version] (http://liris.cnrs.fr/christian.wolf/software/eplot/index.html#download) wurde 2007 veröffentlicht, also ja. Ein besserer Patch, der tatsächlich veröffentlicht werden könnte, würde bedeuten, eine weitere Flagge hinzuzufügen und das Verhalten zu konditionieren, aber ich wollte mich noch nicht anstrengen. 12 mai. 162016-05-12 00:03:46

+2

Ich habe eine Gabel von Eplot auf github mit dem in diesem Thread vorgeschlagenen Patch gesetzt und auch die iTerm2-Inline-Bildanzeige hinzugefügt. https://github.com/dandavison/eplot 18 mär. 172017-03-18 20:44:54

+1

Ich schickte Christian Wolf, den Eplot-Ersteller, einen Patch und er akzeptierte es. Neues Repo auf Github: https://github.com/chriswolfvision/eplot 25 jul. 172017-07-25 18:50:20


21

Eine andere Option, die ich gerade über den Weg gelaufen habe, ist bashplotlib. Hier ist ein Beispiel laufen auf (etwa) die gleichen Daten wie 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| 
----------------------- 

die Behälter Einstellung hilft die Auflösung ein wenig:

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

Stücke in einer einzigen Zeile sind wirklich einfach, und man kann helfen siehe Muster von Höhen und Tiefen.
Siehe auch pysparklines.
(Kennt jemand Unicode schrägen Linien, die zusammenpassen könnte Linie, nicht eine Bar, Plots? Machen)

#!/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 ist ein anderes Front-End gnuplot, die Rohrleitungen in Daten verarbeitet.

$ 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

Wie vergleicht dies mit 'eplot', vorgeschlagen in einer anderen Antwort? 11 mai. 162016-05-11 13:05:06


1

Hier ist mein Patch für ePlot, die eine Option -T für Terminal-Ausgabe ergänzt:

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

das Verwenden Sie es als eplot -T ausführen können ASCII-Grafiken führen anstelle eines gnuplot-Fenster zu erhalten.