Інструмент для побудови графіків / графіків на основі Unix ASCII на основі командного рядка


139

Чи є хороший інструмент для графічного / графічного / графічного UNIX командного рядка? Я шукаю щось, що побудує точки xy на графіку ASCII.

Просто для уточнення, я шукаю щось, що виведе графік у ASCII (наприклад, стиль ascii-art), тому я можу використовувати його під час інтерактивного сеансу оболонки, не потребуючи X.


3
Голосування про закриття, як відтворення інструменту.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Подивіться також на мою відповідь .
not2qubit

Відповіді:


132

Спробуйте gnuplot . Він має дуже потужні можливості графікування.

Він може вивести ваш термінал наступним чином:

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

1
Що означає options are feed 79 24'повідомлення? Це висота і ширина? Чи можете ви розширити свій приклад, щоб встановити їх?
einpoklum

3
@einpoklum: Це розмір ділянки за замовчуванням, який посилається на vga nr стовпців та рядків символів. (Шукайте німого в docx gnuplot)
Еміль Врійдагс

64

Незважаючи на те, що gnuplotвін потужний, він також дуже дратує, коли ви просто хочете зібрати очки та отримати графік.

На щастя, хтось створив еплот (легкий сюжет), який обробляє всі дурниці за вас.

Схоже, у нього немає можливості форсувати графіки терміналів; Я зафіксував це так:

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

Приклад використання:

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

Саме те, що я хотіла - підключившись до gnuplot!
Ліонель

1
Чи потрібен еплот цей пластир?
einpoklum

Остання версія була випущена в 2007 році, так що так. Кращий патч, який насправді може бути звільнений, передбачає додавання іншого прапора та обумовлення поведінки, але я ще не хотів докладати зусиль для цього.
Xiong Chiamiov

2
Я помістив вилку eplot на github із запропонованим у цій нитці патчем, а також додав вбудоване відображення зображення iTerm2. github.com/dandavison/eplot
ded7

9
Я відправив Крістіану Вольфу, творцю еплоту, патч, і він прийняв його. Нове репо на github: github.com/chriswolfvision/eplot
pdbj

25

Ще один варіант, який я щойно наткнувся - це bashplotlib . Ось приклад запуску (приблизно) тих же даних, що і мій приклад 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|
-----------------------

Налаштування бункерів трохи допомагає роздільну здатність:

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

18

Сюжети в одному рядку дійсно прості і можуть допомогти побачити візерунки максимумів і мінімумів.
Дивіться також pysparklines .
(Хто-небудь знає про косих ліній Unicode, які можуть бути об'єднані між собою, щоб зробити лінії, а не штрих, ділянки?)

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

17

feedgnuplot - це ще один передній кінець gnuplot, який обробляє конфігурацію даних.

    $ 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

Як це порівнюється з eplot, запропонованим в іншій відповіді?
einpoklum


6

gnuplot - остаточна відповідь на ваше запитання.

Я особисто також є великим шанувальником API google chart , до якого можна отримати доступ у командному рядку за допомогою wget (або curl), щоб завантажити png-файл (і переглянути за допомогою xview або чогось подібного). Мені подобається цей варіант, тому що я вважаю, що діаграми будуть трохи гарнішими (тобто краще антиалізирующими).


1
Google Image Charts API є застарілим, але дивно.
бон

5

Вам слід скористатися gnuplot і обов'язково видайте команду "встановити термін німий" після запуску. Ви також можете вказати кількість рядків і стовпців. Ось результат з gnuplot, якщо ви видаєте "set term dumb 64 ​​10", а потім "plot sin (x)":

 

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


Це виглядає краще в 79x24 (не використовуйте 80-й стовпець на дисплеї 80x24: деякі реалізації прокльонів не завжди ведуть себе добре навколо останнього стовпця).

Я використовую gnuplot v4, але це має працювати на трохи старших або новіших версіях.


4

Інша простіша / легша альтернатива gnuplot - це ervy , інструмент термінальних графіків на основі NodeJS.

Підтримувані типи: розкидання (точки XY), брусок, пиріг, куля, пончик та калібр.

Приклади використання з різними варіантами можна знайти в проектах GitHub repo

введіть тут опис зображення

введіть тут опис зображення


3

Перевірте пакетний текстовий пакет, який дозволяє будувати дані безпосередньо на терміналі за допомогою python3. Він дуже інтуїтивно зрозумілий, оскільки його використання дуже схоже з пакетом matplotlib .

Ось основний приклад:

введіть тут опис зображення

Ви можете встановити його за допомогою наступної команди:

sudo -H pip install plotext

Що стосується matplotlib, то основними функціями є розкидання (для одиничних точок), графік (для точок, з'єднаних лініями) та показ (фактично друкувати графік на терміналі). Легко вказати розміри сюжету, стилі точки та лінії та будь-що, щоб показати осі, числові відмітки та кінцеві рівняння, які використовуються для перетворення накреслених координат у вихідні реальні значення.

Ось код для створення сюжету, показаного вище:

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)

Параметр clear=Trueвсередині showвикористовується для очищення терміналу перед побудовою графіку: це корисно, наприклад, під час побудови безперервного потоку даних. Тут показаний приклад побудови безперервного потоку даних: введіть тут опис зображення

Опис пакета надає більше інформації про те, як налаштувати сюжет. Пакет був протестований на Ubuntu 16, де він працює чудово. Можливі майбутні розробки (за запитом) можуть передбачати розширення на python2 та інші графічні інтерфейси (наприклад, юпітер). Будь ласка, дайте мені знати, якщо у вас є якісь проблеми з його використанням. Дякую.

Я сподіваюся, що це відповість на вашу проблему.



1

Ось мій патч для eplot, який додає опцію -T для вихідного терміналу:

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

Використовуючи це, ви можете запустити його, eplot -Tщоб отримати результат ASCII-графіки замість вікна gnuplot.


1
Eplot тепер має цей вбудований модуль-d
Макс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.