명령 행 Unix ASCII 기반 차트 / 플로팅 도구


139

훌륭한 커맨드 라인 UNIX 차트 / 그래프 / 플로팅 도구가 있습니까? ASCII 그래프에서 xy 포인트를 그릴 무언가를 찾고 있습니다.

명확히하기 위해 ASCII로 아스키 아트 스타일과 같은 그래프를 출력하는 것을 찾고 있으므로 X가 필요없는 대화 형 쉘 세션에서 사용할 수 있습니다.



또한 내 대답을 살펴보십시오 .
not2qubit

답변:


132

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

1
options are feed 79 24'메시지는 무엇을 의미합니까? 그 높이와 너비입니까? 예를 확장하여 설정할 수 있습니까?
einpoklum

3
@einpoklum : 음모의 기본 크기로, 문자 열과 줄의 vga nr을 나타냅니다. 합니다 (의 gnuplot DOCX에 바보 조회)
에밀 Vrijdags

64

동안 gnuplot강력 많은 포인트를 파이프하고 그래프를 얻으려고 할 때 정말 자극적입니다.

고맙게도 누군가 eplot을 만들었 습니다 (easy plot)을 .

터미널 그래프를 강제 실행하는 옵션이없는 것 같습니다. 나는 그렇게 패치했다.

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

정확히 내가 원하는 것-gnuplot으로 배관!
Lionel

1
eplot에 여전히 해당 패치가 필요합니까?
einpoklum

최신 버전 은 2007 년에 출시되었으므로 예. 실제로 출시 될 수있는 더 나은 패치는 다른 플래그를 추가하고 동작을 조건화하는 것과 관련이 있지만, 아직 그렇게하기를 원하지 않았습니다.
Xiong Chiamiov

2
이 스레드에서 제안한 패치로 github에 eplot 포크를 넣고 iTerm2 인라인 이미지 디스플레이를 추가했습니다. github.com/dandavison/eplot
ded7

9
나는 eplot 제작자 인 Christian Wolf에게 패치를 보냈고 그는 그것을 받아 들였다. github의 새로운 저장소 : github.com/chriswolfvision/eplot
pdbj

25

방금 실행 한 다른 옵션은 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
    --------------------------------------------------------------------------------

18

한 줄의 플롯은 실제로 간단하며 최고점과 최저점의 패턴을 보는 데 도움이 될 수 있습니다 . 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 )

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

이것은 eplot다른 답변에서 제안 된와 어떻게 비교 됩니까?
einpoklum


6

gnuplot 은 귀하의 질문에 대한 확실한 답변입니다.

나는 개인적으로 구글 차트 API 의 큰 팬이며, wget (또는 curl)의 도움으로 명령 줄에서 액세스하여 png 파일을 다운로드 할 수 있습니다 (xview 또는 이와 유사한 것으로보기). 차트가 약간 더 예쁘게 (예 : 안티 앨리어싱 향상)이 옵션을 선호합니다.


1
구글 이미지 차트 API 사용되지 않는,하지만 놀랍습니다.
bonh

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 5 10


79x24에서 더 잘 보입니다 (80x24 디스플레이에서 80 번째 열을 사용하지 마십시오. 일부 curses 구현은 항상 마지막 열에서 제대로 작동하지는 않습니다).

gnuplot v4를 사용하고 있지만 약간 오래된 또는 최신 버전에서 작동합니다.


4

gnuplot의 또 다른 간단하고 가벼운 대안은 ervy입니다. 하는 NodeJS 기반 터미널 차트 도구입니다.

지원되는 유형 : 분산 (XY 포인트), 막대, 파이, 불릿, 도넛 및 게이지.

GitHub 리포지토리 프로젝트에서 다양한 옵션의 사용 예제를 찾을 수 있습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


3

python3을 사용하여 터미널에서 직접 데이터를 플롯 할 수 있는 패키지 plotext 를 확인하십시오 . 사용법은 matplotlib 패키지 와 매우 유사하므로 매우 직관적 입니다.

기본 예는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

다음 명령으로 설치할 수 있습니다.

sudo -H pip install plotext

matplotlib의 경우 주요 기능은 분산 (단일 점의 경우), 플롯 (선으로 연결된 점의 경우) 및 표시 (실제로 터미널에 플롯을 인쇄하는 것)입니다. 플롯 치수, 포인트 및 선 스타일 및 축, 숫자 눈금 및 최종 방정식을 표시하는 모든 것을 쉽게 지정할 수 있습니다.이 좌표는 플롯 된 좌표를 원래의 실제 값으로 변환하는 데 사용됩니다.

위에 표시된 플롯을 생성하는 코드는 다음과 같습니다.

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 및 기타 그래픽 인터페이스 (예 : 목성) 로의 확장이 포함될 수 있습니다. 사용에 문제가 있으면 알려주십시오. 감사.

이것이 귀하의 문제에 답하기를 바랍니다.


2

또한 spark 는 쉘에서 멋진 작은 막대 그래프입니다.


1

다음은 터미널 출력에 -T 옵션을 추가하는 eplot 패치입니다.

--- 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 -Tgnuplot 창 대신 ASCII 그래픽 결과를 얻도록 실행할 수 있습니다 .


1
eplot의 내장 기능은 다음과 같습니다.-d
Max
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.