Командная строка Unix ASCII-инструмент для построения графиков
Есть ли хороший инструмент для построения графиков / графиков / построения графиков в UNIX? Я ищу что-то, что построит точки xy на графике ASCII.
Просто чтобы прояснить, я ищу что-то, что выведет график в ASCII (например, в стиле ascii-art), чтобы я мог использовать его в интерактивной оболочке без использования X.
16 ответов
Попробуй гнуплот. Он имеет очень мощные графические возможности.
Он может выводить на ваш терминал следующим образом:
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
В то время как 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
Смотрите также: asciichart (реализовано в Node.js, Python, Java, Go и Haskell)
Другой вариант, с которым я только что столкнулся - это 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
--------------------------------------------------------------------------------
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
Графики в одной строке действительно просты и могут помочь увидеть модели максимумов и минимумов.
Смотрите также 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 )
Проверьте 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). Пожалуйста, дайте мне знать, если у вас возникнут проблемы с его использованием. Спасибо.
Надеюсь, это решит вашу проблему.
Кроме того, spark - это симпатичная маленькая гистограмма в вашей оболочке.
gnuplot - это исчерпывающий ответ на ваш вопрос.
Лично я также большой поклонник API Google Chart, к которому можно получить доступ из командной строки с помощью wget (или curl) для загрузки png-файла (и просмотра с помощью xview или чего-то подобного). Мне нравится эта опция, потому что я нахожу, что графики немного красивее (т.е. лучше сглаживают).
Еще одна более простая / легкая альтернатива gnuplot - ervy, инструмент для построения диаграмм терминалов на основе NodeJS.
Поддерживаемые типы: разброс (точки XY), стержень, круг, пуля, пончик и калибр.
Примеры использования с различными опциями можно найти на проектах GitHub repo
Я нашел инструмент под названием
ttyplot
в доморощенном. Хорошо. https://github.com/tenox7/ttyplot
Вы должны использовать 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, но это должно работать на немного более старых или более новых версиях.
termplotlib (один из моих проектов) в последнее время набирает популярность, поэтому, возможно, это будет полезно для некоторых людей.
import termplotlib as tpl
import numpy
x = numpy.linspace(0, 2 * numpy.pi, 10)
y = numpy.sin(x)
fig = tpl.figure()
fig.plot(x, y, label="data", width=50, height=15)
fig.show()
1 +---------------------------------------+
0.8 | ** ** |
0.6 | * ** data ******* |
0.4 | ** |
0.2 |* ** |
0 | ** |
| * |
-0.2 | ** ** |
-0.4 | ** * |
-0.6 | ** |
-0.8 | **** ** |
-1 +---------------------------------------+
0 1 2 3 4 5 6 7
Вот мой патч для 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.