कमांड-लाइन यूनिक्स ASCII- आधारित चार्टिंग / प्लॉटिंग टूल


139

वहाँ एक अच्छी कमांड लाइन UNIX चार्टिंग / रेखांकन / प्लॉटिंग उपकरण है? मैं एक ऐसी चीज की तलाश कर रहा हूं जो ASCII ग्राफ पर xy पॉइंट्स को प्लॉट करेगी।

बस स्पष्ट करने के लिए, मैं एक ऐसी चीज की तलाश कर रहा हूं जो ASCII (जैसे एससीआई-आर्ट स्टाइल) में एक ग्राफ का उत्पादन करेगी, इसलिए मैं एक्स की आवश्यकता के बिना एक इंटरैक्टिव शेल सत्र में इसका उपयोग कर सकता हूं।


3
उपकरण आरईसी के रूप में बंद करने के लिए मतदान।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

मेरे जवाब पर भी एक नजर ।
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'संदेश का क्या अर्थ है? क्या वह ऊँचाई और चौड़ाई है? क्या आप उन्हें सेट करने के लिए अपने उदाहरण का विस्तार कर सकते हैं?
ईनपोकलम

3
@einpoklum: यह प्लॉट का डिफ़ॉल्ट आकार है, जो वर्ण स्तंभों और रेखाओं के vga nr को संदर्भित करता है। (
Gnuplot

64

जबकि 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

वास्तव में मैं क्या चाहता था - gnuplot को पाइपिंग!
लियोनेल

1
क्या ईप्लॉट को अभी भी उस पैच की आवश्यकता है?
ईनपोकलम

नवीनतम संस्करण 2007 में जारी किया गया था, इसलिए हाँ। एक बेहतर पैच जो वास्तव में जारी किया जा सकता है, उसमें एक और ध्वज जोड़ना और व्यवहार को सशर्त बनाना शामिल होगा, लेकिन मैं अभी तक ऐसा करने के प्रयास में नहीं लगाना चाहता था।
Xiong Chiamiov

2
मैंने इस थ्रेड में सुझाए गए पैच के साथ गिपब पर ईप्लॉट का कांटा डाल दिया है, और iTerm2 इनलाइन छवि प्रदर्शन भी जोड़ा है। github.com/dandavison/eplot
ded7

9
मैंने क्रिश्चियन वुल्फ, इप्लॉट क्रिएटर, एक पैच भेजा और उन्होंने इसे स्वीकार कर लिया।
गितुब

25

एक अन्य विकल्प जो मैंने अभी-अभी चलाया है, वह है 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
    --------------------------------------------------------------------------------

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

फीडगनअप्लोट 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दूसरे उत्तर में सुझाए गए तरीकों से इसकी तुलना कैसे की जाती है ?
ईनपोकलम


6

gnuplot आपके प्रश्न का निश्चित उत्तर है।

मैं व्यक्तिगत रूप से Google चार्ट एपीआई का एक बड़ा प्रशंसक हूं , जिसे कमांड लाइन से wng (या कर्ल) की सहायता से एक png फ़ाइल डाउनलोड करने के लिए (और xview या कुछ समान के साथ देखने के लिए) एक्सेस किया जा सकता है। मुझे यह विकल्प पसंद है क्योंकि मुझे लगता है कि चार्ट थोड़ा प्रेट्रियर (यानी बेहतर एंटीलिएसिस) हैं।


1
गूगल छवि चार्ट एपीआई पदावनत, लेकिन अद्भुत है।
बॉन

5

आपको gnuplot का उपयोग करना चाहिए और शुरू करने के बाद कमांड "सेट टर्म डंब" जारी करना सुनिश्चित करें। आप एक पंक्ति और स्तंभ गणना भी दे सकते हैं। यहाँ gnuplot से आउटपुट है यदि आप "सेट डम्ब 64 10" जारी करते हैं और फिर "प्लॉट पाप (x)"

 

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


यह 79x24 पर बेहतर दिखता है (80x24 डिस्प्ले पर 80 वें कॉलम का उपयोग न करें: कुछ शाप कार्यान्वयन हमेशा अंतिम कॉलम के आसपास अच्छा व्यवहार नहीं करते हैं)।

मैं gnuplot v4 का उपयोग कर रहा हूं, लेकिन यह थोड़ा पुराने या नए संस्करणों पर काम करना चाहिए।


4

Gnuplot का एक और सरल / हल्का विकल्प ervy है , एक NodeJS आधारित टर्मिनल चार्ट टूल है।

समर्थित प्रकार: तितर बितर (XY अंक), बार, पाई, बुलेट, डोनट और गेज।

विभिन्न विकल्पों के साथ उपयोग के उदाहरण परियोजनाओं GitHub रेपो पर पाए जा सकते हैं

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


3

पैकेज प्लॉटटेक्स की जांच करें जो कि python3 का उपयोग करके सीधे टर्मिनल पर डेटा को प्लॉट करने की अनुमति देता है। यह बहुत सहज है क्योंकि इसका उपयोग मैटलोट्लिब पैकेज के समान है ।

यहाँ एक बुनियादी उदाहरण है:

यहां छवि विवरण दर्ज करें

आप इसे निम्न आदेश के साथ स्थापित कर सकते हैं:

sudo -H pip install plotext

माटप्लोटलिब के रूप में, मुख्य कार्य बिखरे हुए हैं (एकल बिंदुओं के लिए), भूखंड (रेखाओं से जुड़े बिंदुओं के लिए) और शो (वास्तव में टर्मिनल पर भूखंड को प्रिंट करने के लिए)। प्लॉट आयामों, बिंदु और रेखा शैलियों को निर्दिष्ट करना आसान है और जो कुछ भी अक्षों, संख्या टिक और अंतिम समीकरणों को दिखाना है, जो कि प्लॉट किए गए निर्देशांक को मूल वास्तविक मूल्यों में बदलने के लिए उपयोग किया जाता है।

यहाँ ऊपर दिखाए गए प्लॉट का निर्माण करने के लिए कोड है:

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 पर परीक्षण किया गया है जहां यह पूरी तरह से काम करता है। संभावित भविष्य की घटनाओं (अनुरोध पर) में अजगर 2 और अन्य ग्राफिकल इंटरफेस (जैसे बृहस्पति) के लिए विस्तार शामिल हो सकता है। कृपया मुझे बताएं कि क्या आपके पास इसका उपयोग करने में कोई समस्या है। धन्यवाद।

मुझे उम्मीद है कि यह आपकी समस्या का जवाब देगा।



1

यहाँ 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 -Tgnuplot विंडो के बजाय ASCII-graphics परिणाम प्राप्त करने के लिए चला सकते हैं।


1
eplot में अब यह अंतर्निहित है-d
Max
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.