Ferramenta de plotagem / plotagem baseada em ASCII da linha de comando


139

Existe uma boa ferramenta de gráficos / plotagem / plotagem UNIX de linha de comando por aí? Estou procurando algo que irá plotar pontos xy em um gráfico ASCII.

Só para esclarecer, estou procurando algo que produza um gráfico em ASCII (como estilo ascii-art), para que eu possa usá-lo em uma sessão de shell interativa sem precisar do X.


3
Votação para fechar como ferramenta rec.
Ciro Santilli # 7/15

Também dê uma olhada na minha resposta .
not2qubit

Respostas:


132

Tente o gnuplot . Tem possibilidades de gráficos muito poderosas.

Pode enviar para o seu terminal da seguinte maneira:

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
O que a options are feed 79 24'mensagem significa? Essa altura e largura são? Você pode expandir seu exemplo para defini-los?
Einpoklum 11/05

3
@einpoklum: Esse é o tamanho padrão do gráfico, que se refere ao número de colunas e linhas de caracteres. (Lookup muda na docx gnuplot)
Emile Vrijdags

64

Embora gnuplotseja poderoso, também é realmente irritante quando você deseja inserir vários pontos e obter um gráfico.

Felizmente, alguém criou o eplot (easy plot), que lida com todo esse absurdo para você.

Não parece ter uma opção para forçar gráficos de terminal; Eu o corrigi assim:

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

Um exemplo de uso:

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

Exatamente o que eu queria - passando para o gnuplot!
Lionel

1
O eplot ainda precisa desse patch?
Einpoklum 11/05

A versão mais recente foi lançada em 2007, então sim. Um patch melhor que possa realmente ser lançado envolveria adicionar outra flag e condicionar o comportamento, mas ainda não quis me esforçar para fazer isso.
Xiong Chiamiov

2
Coloquei um garfo de eplot no github com o patch sugerido neste tópico e também adicionei a exibição de imagens em linha do iTerm2. github.com/dandavison/eplot
ded7 /

9
Enviei a Christian Wolf, o criador do eplot, um patch e ele aceitou. Novo repositório
pdbj

25

Outra opção que acabei de encontrar é o bashplotlib . Aqui está um exemplo executado (aproximadamente) nos mesmos dados do meu exemplo 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|
-----------------------

Ajustar as caixas ajuda um pouco a resolução:

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

Gráficos em uma única linha são realmente simples e podem ajudar a ver padrões de altos e baixos.
Veja também pysparklines .
(Alguém sabe de linhas inclinadas unicode, que podem ser encaixadas para formar linhas, e não barras, plotagens?)

#!/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

O feedgnuplot é outro front end do gnuplot, que lida com a tubulação de dados.

    $ 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

Como isso se compara com eplot, sugerido em outra resposta?
Einpoklum 11/05


6

O gnuplot é a resposta definitiva para sua pergunta.

Pessoalmente, também sou um grande fã da API do google chart , que pode ser acessada na linha de comando com a ajuda do wget (ou curl) para baixar um arquivo png (e visualizar com xview ou algo semelhante). Gosto dessa opção porque acho os gráficos um pouco mais bonitos (ou seja, melhor antialiasing).


1
A API do Google Image Charts está obsoleta, mas incrível.
bonh

5

Você deve usar o gnuplot e não se esqueça de emitir o comando "set term dumb" após a inicialização. Você também pode fornecer uma contagem de linhas e colunas. Aqui está a saída do gnuplot se você emitir "set term dumb" 64 10 "e depois" plot sin (x) ":

 

    1 ++ ----------- **** ----------- + - *** ------- + ------ * *** - ++
  0,6 * + ** + * + ** * sin (x) ******* ++
  0,2 + * * * ** ** * ** ++
    0 ++ * ** * ** * ** * ++
 -0,4 ++ ** * ** ** * * * +
 -0,8 ++ ** * + * ** + * + ** + *
   -1 ++ - **** ------ + ------- *** --- + ---------- **** ----- ------ ++
     -10 -5 0 5 10


Parece melhor em 79x24 (não use a coluna 80 em uma tela 80x24: algumas implementações de maldições nem sempre se comportam bem em torno da última coluna).

Estou usando o gnuplot v4, mas isso deve funcionar em versões um pouco mais antigas ou mais recentes.


4

Outra alternativa mais simples / leve ao gnuplot é a ervy , uma ferramenta de gráficos de terminal baseada no NodeJS.

Tipos suportados: dispersão (pontos XY), barra, torta, bala, rosca e calibre.

Exemplos de uso com várias opções podem ser encontrados no repositório de projetos do GitHub

insira a descrição da imagem aqui

insira a descrição da imagem aqui


3

Verifique o pacote plotext que permite plotar dados diretamente no terminal usando python3. É muito intuitivo, pois seu uso é muito semelhante ao pacote matplotlib .

Aqui está um exemplo básico:

insira a descrição da imagem aqui

Você pode instalá-lo com o seguinte comando:

sudo -H pip install plotext

Quanto ao matplotlib, as principais funções são scatter (para pontos únicos), plot (para pontos unidos por linhas) e show (para realmente imprimir o plot no terminal). É fácil especificar as dimensões da plotagem, os estilos de ponto e linha e o que quer que seja para mostrar os eixos, marcações numéricas e equações finais, que são usadas para converter as coordenadas plotadas nos valores reais originais.

Aqui está o código para produzir o gráfico mostrado acima:

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)

A opção clear=Trueinterna showé usada para limpar o terminal antes de plotar: isso é útil, por exemplo, ao plotar um fluxo contínuo de dados. Um exemplo de plotagem de um fluxo de dados contínuo é mostrado aqui: insira a descrição da imagem aqui

A descrição do pacote fornece mais informações sobre como personalizar o gráfico. O pacote foi testado no Ubuntu 16, onde funciona perfeitamente. Possíveis desenvolvimentos futuros (mediante solicitação) podem envolver a extensão do python2 e de outras interfaces gráficas (por exemplo, júpiter). Entre em contato se tiver algum problema ao usá-lo. Obrigado.

Espero que isso responda ao seu problema.


2

Além disso, o spark é um pequeno e agradável gráfico de barras no seu shell.


1

Aqui está o meu patch para o eplot que adiciona uma opção -T para a saída do terminal:

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

Usando isso, você pode executá-lo eplot -Tpara obter resultados gráficos ASCII em vez de uma janela do gnuplot.


1
O eplot agora tem este built-in com-d
Max
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.