Befehlszeilen-Unix ASCII-basiertes Diagramm- / Plot-Tool

139

Gibt es da draußen ein gutes Befehlszeilen-UNIX-Diagramm- / Grafik- / Plot-Tool? Ich suche nach etwas, das xy-Punkte in einem ASCII-Diagramm darstellt.

Zur Verdeutlichung suche ich nach etwas, das ein Diagramm in ASCII ausgibt (wie im ASCII-Art-Stil), damit ich es über eine interaktive Shell-Sitzung verwenden kann, ohne X zu benötigen.

bajafresh4life
quelle
3
Abstimmung zum Schließen als Werkzeug rec.
Ciro Santilli 法轮功 冠状 病 六四 事件 7
Schauen Sie sich auch meine Antwort an .
not2qubit

Antworten:

132

Versuchen Sie es mit Gnuplot . Es hat sehr leistungsfähige Grafikmöglichkeiten.

Es kann auf folgende Weise an Ihr Terminal ausgegeben werden:

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
quelle
1
Was bedeutet die options are feed 79 24'Nachricht? Ist das Höhe und Breite? Können Sie Ihr Beispiel erweitern, um sie festzulegen?
Einpoklum
3
@einpoklum: Dies ist die Standardgröße des Diagramms, die sich auf vga nr der Zeichenspalten und -zeilen bezieht. (Lookup dumm im Gnuplot docx)
Emile Vrijdags
64

Es gnuplotist zwar mächtig, aber auch sehr irritierend, wenn Sie nur eine Reihe von Punkten einpfeifen und ein Diagramm erhalten möchten.

Zum Glück hat jemand eplot (easy plot) erstellt, der den ganzen Unsinn für Sie erledigt.

Es scheint keine Option zu geben, um Terminalgraphen zu erzwingen. Ich habe es so gepatcht:

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

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
Xiong Chiamiov
quelle
Genau das, was ich wollte - Piping zu Gnuplot!
Lionel
1
Benötigt eplot diesen Patch noch?
Einpoklum
Die neueste Version wurde 2007 veröffentlicht, also ja. Ein besserer Patch, der tatsächlich veröffentlicht werden könnte, würde das Hinzufügen eines weiteren Flags und das Konditionieren des Verhaltens beinhalten, aber ich wollte mich noch nicht darum bemühen.
Xiong Chiamiov
2
Ich habe mit dem in diesem Thread vorgeschlagenen Patch eine Eplot-Gabel auf Github gelegt und auch die iTerm2-Inline-Bildanzeige hinzugefügt. github.com/dandavison/eplot
ded7
9
Ich habe Christian Wolf, dem Eplot-Schöpfer, einen Patch geschickt und er hat ihn akzeptiert. Neues Repo auf Github: github.com/chriswolfvision/eplot
pdbj
25

Eine andere Option, auf die ich gerade gestoßen bin, ist bashplotlib . Hier ist ein Beispiel, das mit (ungefähr) denselben Daten wie mein Eplot-Beispiel ausgeführt wird :

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

Das Anpassen der Fächer hilft der 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
    --------------------------------------------------------------------------------
Xiong Chiamiov
quelle
18

Grundstücke in einer einzigen Zeile sind wirklich einfach, und kann man helfen , siehe Muster von Höhen und Tiefen.
Siehe auch pysparklines .
(Kennt jemand schräge Unicode-Linien, die zusammengefügt werden könnten, um Linien- und keine Balken-Diagramme zu erstellen?)

#!/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
quelle
17

feedgnuplot ist ein weiteres Frontend von gnuplot, das das Weiterleiten von Daten übernimmt.

    $ 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
quelle
Wie ist dies im Vergleich zu einer eplotanderen Antwort?
Einpoklum
13

Siehe auch: asciichart (implementiert in Node.js, Python, Java, Go und Haskell)

Geben Sie hier die Bildbeschreibung ein

Igor Kroitor
quelle
6

Gnuplot ist die endgültige Antwort auf Ihre Frage.

Ich persönlich bin auch ein großer Fan der Google Chart-API , auf die über die Befehlszeile mit Hilfe von wget (oder curl) zugegriffen werden kann, um eine PNG-Datei herunterzuladen (und mit xview oder ähnlichem anzuzeigen). Ich mag diese Option, weil ich finde, dass die Diagramme etwas hübscher sind (dh besseres Antialiasing).

Tyler
quelle
1
Die Google Image Charts-API ist veraltet, aber erstaunlich.
Bonh
5

Sie sollten gnuplot verwenden und nach dem Start den Befehl "set term dumm" eingeben. Sie können auch eine Zeilen- und Spaltenanzahl angeben. Hier ist die Ausgabe von gnuplot, wenn Sie "set term dumm 64 10" und dann "plot sin (x)" ausgeben:

 

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


Bei 79x24 sieht es besser aus (verwenden Sie die 80. Spalte nicht auf einer 80x24-Anzeige: Einige Fluchimplementierungen verhalten sich in der letzten Spalte nicht immer gut).

Ich verwende gnuplot v4, aber dies sollte auf etwas älteren oder neueren Versionen funktionieren.

Thomas Kammeyer
quelle
4

Eine weitere einfachere / leichtere Alternative zu Gnuplot ist ervy , ein NodeJS-basiertes Terminal-Chart-Tool.

Unterstützte Typen: Streuung (XY-Punkte), Balken, Torte, Kugel, Donut und Messgerät.

Anwendungsbeispiele mit verschiedenen Optionen finden Sie im GitHub-Repo des Projekts

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Daniel Korn
quelle
3

Überprüfen Sie den Paketplotext , mit dem Daten mit python3 direkt auf dem Terminal gezeichnet werden können. Es ist sehr intuitiv, da seine Verwendung dem matplotlib- Paket sehr ähnlich ist .

Hier ist ein grundlegendes Beispiel:

Geben Sie hier die Bildbeschreibung ein

Sie können es mit dem folgenden Befehl installieren:

sudo -H pip install plotext

Bei matplotlib sind die Hauptfunktionen Streuung (für einzelne Punkte), Plot (für durch Linien verbundene Punkte) und Show (um das Plot tatsächlich auf dem Terminal zu drucken). Es ist einfach, die Plotabmessungen, die Punkt- und Linienstile und was auch immer anzugeben, um die Achsen, Zahlenticks und Endgleichungen anzuzeigen, mit denen die geplotteten Koordinaten in die ursprünglichen realen Werte konvertiert werden.

Hier ist der Code zum Erstellen des oben gezeigten Diagramms:

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)

Die Option im clear=TrueInneren showwird verwendet, um das Terminal vor dem Plotten zu löschen. Dies ist beispielsweise nützlich, wenn ein kontinuierlicher Datenfluss geplottet wird. Ein Beispiel für die Darstellung eines kontinuierlichen Datenflusses ist hier dargestellt: Geben Sie hier die Bildbeschreibung ein

In der Paketbeschreibung finden Sie weitere Informationen zum Anpassen des Diagramms. Das Paket wurde unter Ubuntu 16 getestet, wo es perfekt funktioniert. Mögliche zukünftige Entwicklungen (auf Anfrage) könnten eine Erweiterung auf Python2 und andere grafische Schnittstellen (z. B. Jupiter) beinhalten. Bitte lassen Sie mich wissen, wenn Sie Probleme bei der Verwendung haben. Vielen Dank.

Ich hoffe das beantwortet dein Problem.

Savino Piccolomo
quelle
2

Außerdem ist Spark ein schönes kleines Balkendiagramm in Ihrer Shell.

zdk
quelle
1

Hier ist mein Patch für eplot, der eine -T-Option für die Terminalausgabe hinzufügt:

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

Auf diese Weise können Sie es ausführen eplot -T, um anstelle eines Gnuplot-Fensters ein ASCII-Grafikergebnis zu erhalten.

Max Kosyakov
quelle
1
eplot hat jetzt dieses eingebaute mit-d
Max