Командная строка Unix ASCII-инструмент для построения диаграмм/построения


92

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

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

  0

Голосование, чтобы закрыть как инструмент rec. 07 окт. 152015-10-07 15:16:18

96

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

Ударьте меня к удару. Удаление моего дубликата. 23 сен. 082008-09-23 19:58:00

  0

Что означает сообщение 'options feed 79 24 ''? Это высота и ширина? Можете ли вы расширить свой пример, чтобы установить их? 11 май. 162016-05-11 13:02:16

+1

@einpoklum: Это размер шрифта по умолчанию, который относится к vga nr столбцов и строк символов. (Lookup dumb in gnuplot docx) 05 июн. 172017-06-05 08:14:53


2

очень тяжелый и одолели решение было бы установить и использовать cernlibpaw.

  0

-1 для того, чтобы дать мне воспоминания о школе градиента :) 14 авг. 132013-08-14 00:22:31

+4

... кажется, @MarkLakata фактически не -1. 11 май. 162016-05-11 13:05:27


6

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

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

  0

[API графических карт Google] (https://developers.google.com/chart/image/docs/making_charts) устарел, но поразителен. 21 май. 152015-05-21 17:30:25


3

Вы должны использовать gnuplot и обязательно запускать команду «set term dumb» после запуска. Вы также можете указать количество строк и столбцов. Вот выход из Gnuplot, если вы выдаете «установить срок немого 64 10» , а затем «сюжет грех (х)»:

 

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


Это выглядит лучше 79x24 (не используйте 80-й столбец на Дисплей 80x24: некоторые реализации проклятий не всегда хорошо ведут себя вокруг последнего столбца).

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


51

В то время как gnuplot является мощным, это также очень раздражает, когда вы просто хотите проложить трубку в кучу точек и получить график.

К счастью, кто-то создал eplot (легкий участок), который обрабатывает всю ерунду для вас.

У него нет возможности форсировать терминальные графики; Я исправил это так:

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

Пример использования:

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

Точно то, что я хотел - прокладывать трубку до gnuplot! 07 дек. 122012-12-07 06:18:33

  0

Имеет ли eplot еще этот патч? 11 май. 162016-05-11 13:03:16

  0

[Последняя версия] (http://liris.cnrs.fr/christian.wolf/software/eplot/index.html#download) была выпущена в 2007 году, так что да. Лучшее исправление, которое действительно может быть выпущено, должно включать добавление другого флага и условное поведение, но я еще не хотел прилагать усилия для этого. 12 май. 162016-05-12 00:03:46

+2

Я поместил вилку eplot на github с патчем, предложенным в этой теме, а также добавил отображение встроенного изображения iTerm2. https://github.com/dandavison/eplot 18 мар. 172017-03-18 20:44:54

+1

Я отправил Кристиана Вольфа, создателя eplot, патча, и он принял его. Новое репо на github: https://github.com/chriswolfvision/eplot 25 июл. 172017-07-25 18:50:20


21

Другой вариант я просто перебежать на bashplotlib. Вот пример работы на (примерно) одни и те же данные, как 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| 
----------------------- 

Регулировка бункеров помогает резолюция немного:

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

участки в одной строке очень просты, и может помочь см. паттернов максимумов и минимумов.
См. Также pysparklines.
(Кто-нибудь знает Юникода косые линии, которые можно было бы совмещаются, чтобы сделать линию, а не бар, участки?)

#!/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 еще один передний конец 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 
  0

Как это сравнить с 'eplot', предложенным в другом ответе? 11 май. 162016-05-11 13:05:06


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.