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

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

只是为了澄清,我正在寻找一些东西,将输出一个图形在 ASCII (如 ASCII-art 风格) ,所以我可以使用它在一个交互式 shell 会话,而不需要 X。

123140 次浏览

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

Gnuplot 是对您的问题的明确回答。

我个人也非常喜欢 谷歌图表 API,可以通过 wget (或 curl)从命令行访问它,下载一个 png 文件(并使用 xview 或类似的工具查看)。我喜欢这个选项,因为我发现图表稍微漂亮一些(即更好的反锯齿)。

您应该使用 gnuplot 并确保发出命令“ set term mub” 启动后。您还可以给出一个行和列计数。 下面是 gnuplot 的输出,如果您发出“ set term mub 6410”命令 然后是“ plot sin (x)”:



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




它在79x24看起来更好(不要在80x24显示器上使用第80列: 一些诅咒实现在最后一列并不总是表现良好)。

我使用的是 gnuplot v4,但是它应该可以在稍微老一点或更新一点的版本上工作。

虽然 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:

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

在一条线的情节是真的很简单,可以帮助一个 模式的高点和低点。
参见 火花
(有人知道 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 )

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

你可以通过运行 sudo apt install feedgnuplot在 Debian 和 Ubuntu 上安装它。

下面是我的 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 窗口。

另见: Asciichart(在 Node.js 和 移植中实现到 Python、 Java、 去吧和 Haskell)

enter image description here

Gnuplot 的另一个更简单/更轻便的替代品是 Ervy,这是一个基于 NodeJS 的终端图表工具。

支持类型: 分散(XY 点) ,酒吧,馅饼,子弹,甜甜圈和规范。

具有各种选项的使用示例可以在项目 GitHub 回收站中找到

enter image description here

enter image description here

而且,火花是您 shell 中的一个不错的小条形图。

我找到一个自制的工具,叫 ttyplot很好,https://github.com/tenox7/ttyplot

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