命令行Unix基于ASCII的制图/绘图工具

那里有一个很好的命令行UNIX图表/绘图/绘图工具吗? 我正在寻找将在ASCII图上绘制xy点的东西。

只是为了澄清,我正在寻找的东西,将输出一个ASCIIgraphics(如ascii艺术风格),所以我可以使用它在交互式shell会话,而不需要X.

试试gnuplot 。 它有非常强大的graphics可能性。

它可以通过以下方式输出到您的terminal:

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 

虽然gnuplotfunction强大,但是当你只想在一堆点上绘制graphics时,也会感到非常恼火。

谢天谢地,有人创build了eplot (简单的情节),为你处理所有的废话。

似乎没有强迫terminal图的select; 我像这样打补丁:

 --- 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| ooo 1| ooooo 0| ooooooo ---------------------- ----------------------- | 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| oo 4| ooo 3| ooooo 2| ooooo 1| ooooooo 0| ooooooooooooo | ooooooooooooo -------------------------------------------------------------------------------- 

一条线上的情节非常简单,可以帮助你看到高低不一的模式。
另请参阅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的另一个前端,它处理数据中的pipe道。

  $ 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 

gnuplot是你的问题的权威答案。

我个人也是google chart API的粉丝,可以通过wget(或curl)的帮助从命令行下载一个png文件(以及使用xview或类似的东西进行查看)。 我喜欢这个选项,因为我发现图表稍微漂亮(即更好的抗锯齿)。

你应该使用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


它看起来更好79×24(不要在80×24显示器上使用第80列:有些诅咒实现并不总是在最后一列的performance很好)。

我正在使用gnuplot v4,但这应该适用于稍微旧的或更新的版本。

一个非常沉重而且强大的解决scheme是安装cernlib并使用爪子 。

这是我的eplot补丁,为terminal输出添加-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来获得ASCIIgraphics结果,而不是一个gnuplot窗口。