Komut satırı Unix ASCII tabanlı grafik / çizim aracı


139

Orada iyi bir komut satırı UNIX grafik / grafik / çizim aracı var mı? ASCII grafiğinde xy noktalarını çizecek bir şey arıyorum.

Sadece açıklığa kavuşturmak için, ASCII'de (ascii-art tarzı gibi) bir grafik çıkaracak bir şey arıyorum, bu yüzden X'e ihtiyaç duymadan etkileşimli bir kabuk oturumu üzerinde kullanabilirim.


3
Araç rec olarak kapatmak için oylama.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Ayrıca benim de bakabilirsiniz cevap .
not2qubit

Yanıtlar:


132

Gnuplot'u deneyin . Çok güçlü grafik oluşturma imkanlarına sahiptir.

Terminalinize aşağıdaki şekilde çıkış yapabilir:

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'Mesaj ne anlama geliyor? Bu yükseklik ve genişlik mi? Bunları ayarlamak için örneğinizi genişletebilir misiniz?
einpoklum

3
@ einpoklum: Çizimin varsayılan boyutu, karakter sütunlarının ve satırlarının vga nr'sini gösterir. (Gnuplot
docx'de

64

gnuplotGüçlü olsa da, sadece bir sürü noktaya boru atmak ve bir grafik almak istediğinizde gerçekten rahatsız edici.

Neyse ki, birisi sizin için tüm saçmalıkları ele alan eplot (kolay arsa) yarattı .

Terminal grafiklerini zorlamak için bir seçeneği yok gibi görünüyor; Ben böyle yamalı:

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

Kullanım örneği:

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

Tam olarak ne istedim - gnuplot için boru!
Lionel

1
Eplot'un hala bu yamaya ihtiyacı var mı?
einpoklum

En son sürüm 2007'de piyasaya sürüldü, bu yüzden evet. Aslında serbest bırakılabilecek daha iyi bir yama, başka bir bayrak eklemeyi ve davranışı koşullulaştırmayı içerir, ancak henüz bunu yapmak için çaba harcamak istemedim.
Xiong Chiamiov

2
Bu iş parçacığında önerilen yama ile github üzerine eplot çatalı koydum ve ayrıca iTerm2 satır içi görüntü ekranı ekledim. github.com/dandavison/eplot
ded7

9
Eplot yaratıcısı Christian Wolf'u bir yama gönderdim ve kabul etti. Github'da
pdbj

25

Daha önce karşılaştığım başka bir seçenek de bashplotlib . İşte eplot örneğimle (kabaca) aynı veriler üzerinde çalışan bir örnek :

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

Kutuları ayarlamak çözünürlüğü biraz yardımcı olur:

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

Tek bir çizgideki araziler gerçekten basittir ve birinin yüksek ve düşük kalıplarını görmesine yardımcı olabilir .
Ayrıca bkz . Pysparkline .
(Herkes, çubuk değil, çizgi yapmak için birbirine uygun olabilecek unicode eğik çizgileri biliyor mu?)

#!/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 , veri borularını işleyen gnuplot için bir başka ön uçtur .

    $ 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

eplotBaşka bir cevapta bu nasıl karşılaştırılır ?
einpoklum


6

gnuplot , sorunuzun kesin cevabıdır.

Şahsen ben de bir png dosyasını indirmek için wget (veya curl) yardımıyla komut satırından erişilebilen google grafik API'sinin büyük bir hayranıyım (ve xview veya benzeri bir şeyle görüntüleyin). Bu seçeneği seviyorum çünkü grafikleri biraz daha güzel buluyorum (yani daha iyi kenar yumuşatma).


1
Google Resim Grafikler API kullanımdan kaldırıldı, ancak şaşırtıcı olan.
bonh

5

Başladıktan sonra gnuplot kullanmalı ve "set aptal" komutunu vermeyi unutmayın. Ayrıca satır ve sütun sayısı da verebilirsiniz. "Aptal 64 10 terimini ayarla" ve sonra "plot sin (x)" komutunu verirseniz gnuplot çıktısı:

 

    1 ++ ----------- **** ----------- + - *** ------- + ------ * *** - ++
  0.6 * + ** + * + ** * günah (x) ******* ++
  0.2 + * * * ** ** * ** ++
    0 ++ * ** * ** * ** * ++
 -0,4 ++ ** * ** ** * * * +
 -0,8 ++ ** * + * ** + * + ** + *
   -1 ++ - **** ------ + ------- *** - + ---------- **** ----- ------ ++
     -10-5 0 5 10


79x24'te daha iyi görünüyor (80x24 ekranda 80. sütunu kullanmayın: bazı lanet uygulamaları her zaman son sütunda iyi davranmaz).

Gnuplot v4 kullanıyorum, ancak bu biraz daha eski veya daha yeni sürümlerde çalışmalıdır.


4

Gnuplot'a bir başka daha basit / daha hafif alternatif , NodeJS tabanlı terminal çizelgeleri aracı olan ervy'dir.

Desteklenen türler: dağılım (XY noktaları), çubuk, pasta, madde işareti, halka ve gösterge.

Çeşitli seçeneklere sahip kullanım örnekleri GitHub repo projelerinde bulunabilir

resim açıklamasını buraya girin

resim açıklamasını buraya girin


3

Python3 kullanarak verileri doğrudan terminalde çizmeye izin veren paket plotext'i kontrol edin . Kullanımı matplotlib'e çok benzediğinden çok sezgisel paketine .

İşte temel bir örnek:

resim açıklamasını buraya girin

Aşağıdaki komutla kurabilirsiniz:

sudo -H pip install plotext

Matplotlib'e gelince, ana işlevler dağılım (tek noktalar için), çizim (çizgilerle birleştirilen noktalar için) ve şovdur. (gerçekte çizimi terminalde yazdırmak için). Çizim koordinatlarını orijinal gerçek değerlere dönüştürmek için kullanılan çizim boyutlarını, nokta ve çizgi stillerini ve eksenleri, sayı tiklerini ve son denklemleri gösterecek her şeyi belirlemek kolaydır.

Yukarıda gösterilen grafiği üretmek için kod:

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)

Seçenek clear=Trueiçinde showplot edilmesinden önce terminali temizlemek için kullanılır: Bu faydalıdır, örneğin, bir veri sürekli akış çizdirirken. Sürekli bir veri akışı çizme örneği burada gösterilmektedir: resim açıklamasını buraya girin

Paket açıklaması arsa nasıl özelleştirileceği fazla bilgi sağlar. Paket, mükemmel çalıştığı Ubuntu 16'da test edildi. Gelecekteki olası gelişmeler (talep üzerine) python2 ve diğer grafik arayüzlere (örneğin, jüpiter) genişletmeyi içerebilir. Kullanırken herhangi bir sorun yaşarsanız lütfen bize bildirin. Teşekkürler.

Umarım bu sorunun cevabını verir.



1

Terminal çıkışı için bir -T seçeneği ekleyen eplot için benim yama İşte:

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

Bunu kullanarak eplot -T, bir gnuplot penceresi yerine ASCII-grafik sonucu almak için çalıştırabilirsiniz .


1
eplot şimdi bu yerleşik-d
Max
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.