Есть ли хороший инструмент для построения диаграмм / графиков / построения графиков в командной строке UNIX? Я ищу что-то, что будет отображать точки xy на графике ASCII.
Чтобы прояснить, я ищу что-то, что будет выводить график в ASCII (например, в стиле ascii-art), поэтому я могу использовать его в интерактивном сеансе оболочки без необходимости X.
unix
charts
graph
matplotlib
bajafresh4life
источник
источник
Ответы:
Попробуйте 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
источник
options are feed 79 24'
сообщение? Это высота и ширина? Можете ли вы расширить свой пример, чтобы подать их?Хотя
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
источник
Другой вариант, с которым я только что столкнулся, - это 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 --------------------------------------------------------------------------------
источник
Графики в одну линию действительно просты и могут помочь увидеть модели максимумов и минимумов.
См. Также 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 )
источник
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
предложенным в другом ответе?См. Также: asciichart (реализовано в Node.js, Python, Java, Go и Haskell)
источник
gnuplot - это окончательный ответ на ваш вопрос.
Я лично также большой поклонник API диаграммы Google , доступ к которому можно получить из командной строки с помощью wget (или curl) для загрузки файла png (и просмотра с помощью xview или чего-то подобного). Мне нравится этот вариант, потому что я считаю, что графики немного красивее (т.е. лучше сглаживание).
источник
Вам следует использовать gnuplot и после запуска обязательно ввести команду "set term dumb". Вы также можете указать количество строк и столбцов. Вот результат gnuplot, если вы введете "set term dumb 64 10", а затем "plot sin (x)":
Он выглядит лучше при 79x24 (не используйте 80-й столбец на дисплее 80x24: некоторые реализации curses не всегда хорошо работают с последним столбцом).
Я использую gnuplot v4, но он должен работать в более старых или новых версиях.
источник
Еще одна более простая и легкая альтернатива gnuplot - ervy , инструмент для построения графиков терминалов на основе NodeJS.
Поддерживаемые типы: разброс (точки XY), полоса, круговая диаграмма, пуля, пончик и калибр.
Примеры использования с различными вариантами можно найти в репозитории GitHub проектов.
источник
Проверьте plotext пакета, который позволяет отображать данные непосредственно на терминале с помощью python3. Это очень интуитивно понятно, так как его использование очень похоже на пакет matplotlib .
Вот простой пример:
Вы можете установить его с помощью следующей команды:
Что касается 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 - это симпатичная маленькая гистограмма в вашей оболочке.
источник
Вот мой патч для 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.источник
-d