Oparte na ASCII narzędzie do tworzenia wykresów / kreślenia z wiersza poleceń

139

Czy istnieje dobre narzędzie do tworzenia wykresów / wykresów / kreślenia z wiersza poleceń w systemie UNIX? Szukam czegoś, co wykreśli punkty xy na wykresie ASCII.

Aby wyjaśnić, szukam czegoś, co wyświetli wykres w ASCII (jak w stylu ascii-art), więc mogę go używać w interaktywnej sesji powłoki bez konieczności używania X.

bajafresh4life
źródło
3
Głosowanie za zamknięciem jako rec.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Spójrz też na moją odpowiedź .
not2qubit

Odpowiedzi:

132

Spróbuj gnuplot . Ma bardzo potężne możliwości graficzne.

Może wysyłać do twojego terminala w następujący sposób:

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
źródło
1
Co oznacza ta options are feed 79 24'wiadomość? Czy to wysokość i szerokość? Czy możesz rozszerzyć swój przykład, aby je ustanowić?
einpoklum
3
@einpoklum: To jest domyślny rozmiar wykresu, który odnosi się do VGA nr kolumn i linii znaków. (Lookup dumb in the gnuplot docx)
Emile Vrijdags
64

Chociaż gnuplotjest potężny, jest również naprawdę irytujący, gdy chcesz po prostu rzucić kilka punktów i uzyskać wykres.

Na szczęście ktoś stworzył eplot (łatwy wątek), który załatwia wszystkie bzdury za Ciebie.

Wygląda na to, że nie ma opcji wymuszania wykresów terminali; Poprawiłem to tak:

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

Przykładowe zastosowanie:

[$]> 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
źródło
Dokładnie to, czego chciałem - podłączenie do gnuplot!
Lionel
1
Czy eplot nadal potrzebuje tej poprawki?
einpoklum
Najnowsza wersja została wydana w 2007 roku, więc tak. Lepsza łatka, która mogłaby faktycznie zostać wydana, wymagałaby dodania kolejnej flagi i uwarunkowania zachowania, ale nie chciałem jeszcze włożyć żadnego wysiłku, aby to zrobić.
Xiong Chiamiov
2
Umieściłem widelec eplota na githubie z łatką sugerowaną w tym wątku, a także dodałem wyświetlanie obrazu w wierszu iTerm2. github.com/dandavison/eplot
ded7
9
Wysłałem Christianowi Wolfowi, twórcy eplota, łatkę, a on ją przyjął. Nowe repozytorium na github: github.com/chriswolfvision/eplot
pdbj
25

Inną opcją, z którą właśnie się spotkałem, jest bashplotlib . Oto przykład działający na (z grubsza) tych samych danych, co mój przykład 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|
-----------------------

Dostosowanie pojemników pomaga nieco rozdzielczość:

[$]> 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
źródło
18

Wykresy w jednej linii są naprawdę proste i mogą pomóc dostrzec wzorce wzlotów i upadków.
Zobacz także pysparklines .
(Czy ktoś wie o ukośnych liniach Unicode, które można połączyć, aby utworzyć linię, a nie pasek, wykresy?)

#!/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
źródło
17

feedgnuplot to kolejna nakładka na gnuplot, która obsługuje potokowanie danych.

    $ 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
źródło
Jak to się ma do tego eplot, co sugeruje inna odpowiedź?
einpoklum
13

Zobacz też: asciichart (zaimplementowane w Node.js, Python, Java, Go i Haskell)

wprowadź opis obrazu tutaj

Igor Kroitor
źródło
6

gnuplot to ostateczna odpowiedź na twoje pytanie.

Osobiście jestem też wielkim fanem Google chart API , do którego można uzyskać dostęp z wiersza poleceń za pomocą wget (lub curl), aby pobrać plik png (i wyświetlić za pomocą xview lub czegoś podobnego). Podoba mi się ta opcja, ponieważ uważam, że wykresy są nieco ładniejsze (tj. Lepszy antyaliasing).

Tyler
źródło
1
Interfejs Google Image Charts API jest przestarzały, ale niesamowity.
bonh
5

Powinieneś użyć gnuplot i po uruchomieniu wydać polecenie „set term dumb”. Możesz również podać liczbę wierszy i kolumn. Oto wynik polecenia gnuplot, jeśli wydasz „set term dumb 64 ​​10”, a następnie „plot sin (x)”:

 

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


Wygląda lepiej przy 79x24 (nie używaj 80-tej kolumny na ekranie 80x24: niektóre implementacje curses nie zawsze zachowują się dobrze w pobliżu ostatniej kolumny).

Używam gnuplot v4, ale powinno to działać na nieco starszych lub nowszych wersjach.

Thomas Kammeyer
źródło
4

Inną prostszą / lżejszą alternatywą dla gnuplot jest ervy , oparte na NodeJS narzędzie do tworzenia wykresów terminali.

Obsługiwane typy: scatter (punkty XY), bar, pie, bullet, donut i gauge.

Przykłady użycia z różnymi opcjami można znaleźć w repozytorium projektów GitHub

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Daniel Korn
źródło
3

Sprawdź pakiet plotext, który umożliwia wykreślanie danych bezpośrednio na terminalu za pomocą python3. Jest bardzo intuicyjny, ponieważ jego obsługa jest bardzo podobna do pakietu matplotlib .

Oto podstawowy przykład:

wprowadź opis obrazu tutaj

Możesz go zainstalować za pomocą następującego polecenia:

sudo -H pip install plotext

Jeśli chodzi o matplotlib, głównymi funkcjami są rozpraszanie (dla pojedynczych punktów), plot (dla punktów połączonych liniami) i show (aby faktycznie wydrukować wykres na terminalu). Łatwo jest określić wymiary wykresu, style punktów i linii oraz cokolwiek innego, aby pokazać osie, znaczniki liczbowe i końcowe równania, które są używane do konwersji wykreślonych współrzędnych na oryginalne wartości rzeczywiste.

Oto kod do utworzenia wykresu pokazanego powyżej:

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)

Opcja clear=Truewewnątrz showsłuży do wyczyszczenia terminala przed wydrukowaniem: jest to przydatne na przykład podczas kreślenia ciągłego przepływu danych. Oto przykład kreślenia ciągłego przepływu danych: wprowadź opis obrazu tutaj

Opis Pakiet zawiera więcej informacji, jak dostosować fabuły. Pakiet został przetestowany na Ubuntu 16, gdzie działa doskonale. Możliwe przyszłe zmiany (na żądanie) mogą obejmować rozszerzenie do python2 i innych interfejsów graficznych (np. Jupiter). Daj mi znać, jeśli masz jakiekolwiek problemy z jego używaniem. Dzięki.

Mam nadzieję, że to odpowiada na twój problem.

Savino Piccolomo
źródło
2

Ponadto iskra jest ładnym małym wykresem słupkowym w twojej powłoce.

zdk
źródło
1

Oto moja łatka dla eplot, która dodaje opcję -T do wyjścia terminala:

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

Używając tego możesz uruchomić go jako eplot -Twynik ASCII-graphics zamiast okna gnuplot.

Max Kosyakov
źródło
1
eplot ma teraz wbudowaną opcję-d
Max.