Командная строка Unix, основанная на ASCII инструменте построения диаграмм / графиков

142

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

Чтобы прояснить, я ищу что-то, что будет выводить график в ASCII (например, в стиле ascii-art), поэтому я могу использовать его в интерактивном сеансе оболочки без необходимости X.

bajafresh4life
источник
4
Голосование за закрытие как инструмент рек.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
Также посмотрите мой ответ .
not2qubit

Ответы:

136

Попробуйте 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)
Эмиль Вридждагс
66

Хотя 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
Сюн Чямиов
источник
1
Именно то, что я хотел - подключение к gnuplot!
Лайонел
1
Нужен ли еще эплот патч?
einpoklum
Последняя версия была выпущена в 2007 году, так что да. Лучший патч, который может быть выпущен, будет включать добавление еще одного флага и условное обозначение поведения, но я еще не хотел прикладывать усилия для этого.
Xiong Chiamiov
2
Я разместил вилку eplot на github с патчем, предложенным в этой ветке, а также добавил встроенное отображение изображений iTerm2. github.com/dandavison/eplot
5fec,
10
Я отправил Кристиану Вольфу, создателю эплота, патч, и он его принял. Новое репо на github: github.com/chriswolfvision/eplot
pdbj
26

Другой вариант, с которым я только что столкнулся, - это 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
    --------------------------------------------------------------------------------
Сюн Чямиов
источник
19

Графики в одну линию действительно просты и могут помочь увидеть модели максимумов и минимумов.
См. Также 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 )
Денис
источник
18

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
mc0e
источник
Как это соотносится с eplotпредложенным в другом ответе?
einpoklum
15

См. Также: asciichart (реализовано в Node.js, Python, Java, Go и Haskell)

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

Игорь Кройтор
источник
7

gnuplot - это окончательный ответ на ваш вопрос.

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

Тайлер
источник
1
Google Image Charts API является устаревшим, но удивительно.
Приятно
5

Вам следует использовать gnuplot и после запуска обязательно ввести команду "set term dumb". Вы также можете указать количество строк и столбцов. Вот результат 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: некоторые реализации curses не всегда хорошо работают с последним столбцом).

Я использую gnuplot v4, но он должен работать в более старых или новых версиях.

Томас Каммейер
источник
4

Еще одна более простая и легкая альтернатива gnuplot - ervy , инструмент для построения графиков терминалов на основе NodeJS.

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

Примеры использования с различными вариантами можно найти в репозитории GitHub проектов.

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

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

Даниэль Корн
источник
4

Проверьте plotext пакета, который позволяет отображать данные непосредственно на терминале с помощью python3. Это очень интуитивно понятно, так как его использование очень похоже на пакет matplotlib .

Вот простой пример:

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

Вы можете установить его с помощью следующей команды:

sudo -H pip install plotext

Что касается matplotlib, основными функциями являются scatter (для отдельных точек), plot (для точек, соединенных линиями) и show (для фактической печати графика на терминале). Легко указать размеры графика, стили точек и линий и все, что угодно, чтобы показать оси, числовые отметки и окончательные уравнения, которые используются для преобразования нанесенных координат в исходные реальные значения.

Вот код для построения графика, показанного выше:

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 и других графических интерфейсов (например, jupiter). Пожалуйста, дайте мне знать, если у вас возникнут проблемы с его использованием. Спасибо.

Надеюсь, это решит вашу проблему.

Савино Пикколомо
источник
3

Кроме того, Spark - это симпатичная маленькая гистограмма в вашей оболочке.

zdk
источник
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
Max