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

baj*_*ife 131 unix charts graph matplotlib

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

只是为了澄清,我正在寻找能够输出ASCII图形的东西(如ascii-art样式),所以我可以在交互式shell会话中使用它而不需要X.

Pal*_*min 127

试试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
Run Code Online (Sandbox Code Playgroud)

  • @einpoklum:这是情节的默认大小,它是指字符列和行的vga nr。(在gnuplot docx中查找哑音) (2认同)

Xio*_*iov 64

虽然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"+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
Run Code Online (Sandbox Code Playgroud)

使用示例:

[$]> 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
Run Code Online (Sandbox Code Playgroud)

  • 我发送了剧情创作者克里斯蒂安沃尔夫,并且接受了它.github上的新回购:https://github.com/chriswolfvision/eplot (9认同)
  • 我已经在github上添加了一个eplot的分支,并在此主题中提供了补丁,并添加了iTerm2内联图像显示.https://github.com/dandavison/eplot (2认同)

Xio*_*iov 24

我刚遇到的另一个选择是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|
-----------------------
Run Code Online (Sandbox Code Playgroud)

调整垃圾箱有助于提高分辨率:

[$]> 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
    --------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)


den*_*nis 18

单行中的绘图非常简单,可以帮助人们看到高点和低点的模式.
另见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 )
Run Code Online (Sandbox Code Playgroud)


mc0*_*c0e 17

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
Run Code Online (Sandbox Code Playgroud)


Igo*_*tor 11

另请参见:asciichart(在Node.js,Python,Java,Go和Haskell中实现)

在此输入图像描述

  • 非常有前途且漂亮的图表,只是我不想仅为一个工具添加另一个包管理器。我不经常使用 npm... (3认同)

Tyl*_*ler 6

gnuplot是你问题的最终答案.

我个人也是谷歌图表API的忠实粉丝,可以在wget(或curl)的帮助下从命令行访问以下载png文件(并使用xview或类似的东西查看).我喜欢这个选项,因为我发现图表稍微漂亮(即更好的抗锯齿).


Sav*_*omo 6

检查允许使用 python3 在终端上直接绘制数据的包plotext。它非常直观,因为它的使用与matplotlib包非常相似。

这是一个基本示例:

在此处输入图片说明

您可以使用以下命令安装它:

sudo -H pip install plotext
Run Code Online (Sandbox Code Playgroud)

至于 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)
Run Code Online (Sandbox Code Playgroud)

clear=True里面的选项show用于在绘图前清除终端:这很有用,例如,在绘制连续的数据流时。绘制连续数据流的示例如下所示: 在此处输入图片说明

包描述提供了更多的信息,如何自定义曲线。该软件包已在 Ubuntu 16 上进行了测试,可以完美运行。未来可能的发展(根据要求)可能涉及对 python2 和其他图形界面(例如 jupiter)的扩展。如果您在使用时遇到任何问题,请告诉我。谢谢。

我希望这能解决你的问题。


San*_*alp 6

我发现了一个名为 in homebrew 的工具ttyplot。很好。https://github.com/tenox7/ttyplot


Tho*_*yer 5

您应该使用gnuplot,并确保在启动后发出命令“ set term dumb”。您还可以给出行数和列数。如果发出“ set term dumb 64 10”,然后发出“ plot sin(x)”,则这是gnuplot的输出:

 

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


在79x24时看起来更好(不要在80x24的显示屏上使用第80列:某些curses实现在最后一列周围的表现并不总是很好)。

我正在使用gnuplot v4,但是这应该在稍旧或较新的版本上有效。


Dan*_*orn 5

gnuplot 的另一个更简单/更轻量级的替代品是ervy,这是一种基于NodeJS的终端图表工具。

支持的类型:散点图(XY 点)、条形图、饼图、子弹、甜甜圈和仪表。

可以在项目GitHub 存储库中找到具有各种选项的使用示例

在此处输入图片说明

在此处输入图片说明


zdk*_*zdk 5

此外,spark是您外壳中的一个漂亮的小条形图。