أداة رسم/تخطيط تعتمد على سطر الأوامر Unix ASCII
-
02-07-2019 - |
سؤال
هل هناك أداة جيدة للرسم البياني/الرسوم البيانية/التخطيط لسطر الأوامر لنظام UNIX؟أنا أبحث عن شيء من شأنه أن يرسم نقاط xy على رسم بياني ASCII.
فقط للتوضيح، أنا أبحث عن شيء من شأنه إخراج رسم بياني بتنسيق ASCII (مثل نمط ascii-art)، حتى أتمكن من استخدامه خلال جلسة تفاعلية دون الحاجة إلى X.
المحلول
يحاول 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
نصائح أخرى
بينما 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
خيار آخر قمت بتشغيله للتو هو com.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
--------------------------------------------------------------------------------
المؤامرات في سطر واحد بسيطة حقًا، ويمكن أن تساعد الشخص يرى أنماط الارتفاعات والانخفاضات.
أنظر أيضا 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 )
com.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
أنظر أيضا: com.asciichart (تم تنفيذه في Node.js وPython وJava وGo وHaskell)
gnuplot هو الجواب النهائي لسؤالك.
أنا شخصيا أيضا من أشد المعجبين بـ واجهة برمجة تطبيقات مخطط جوجل, ، والذي يمكن الوصول إليه من سطر الأوامر بمساعدة wget (أو تجعيد) لتنزيل ملف png (وعرضه باستخدام xview أو شيء مشابه).يعجبني هذا الخيار لأنني أجد أن المخططات أجمل قليلاً (أي.تحسين الحواف بشكل أفضل).
يجب عليك استخدام gnuplot والتأكد من إصدار الأمر "Set Term Dumb" بعد البدء.يمكنك أيضًا تحديد عدد الصفوف والأعمدة.فيما يلي الإخراج من GNUPLOT إذا قمت بإصدار "Set Term Dumb 64 10" ثم "Plot Sin (X)":
1 ++-----------****-----------+--***-------+------****--++ 0.6 *+ **+ * +** * sin(x)*******++ 0.2 +* * * ** ** * **++ 0 ++* ** * ** * ** *++ -0.4 ++** * ** ** * * *+ -0.8 ++ ** * + * ** + * +** +* -1 ++--****------+-------***---+----------****-----------++ -10 -5 0 5 10
يبدو أفضل عند 79 × 24 (لا تستخدم العمود 80 على شاشة مقاس 80 × 24:بعض تطبيقات اللعنات لا تعمل دائمًا بشكل جيد حول العمود الأخير).
أنا أستخدم gnuplot v4، ولكن من المفترض أن يعمل هذا على الإصدارات الأقدم أو الأحدث قليلاً.
بديل آخر أبسط/أخف وزنًا لـ gnuplot هو ervy, ، أداة للمخططات الطرفية تعتمد على NodeJS.
الأنواع المدعومة:مبعثر (نقاط XY)، شريط، دائري، رصاصة، دونات وقياس.
يمكن العثور على أمثلة الاستخدام مع خيارات مختلفة في المشاريع جيثب الريبو
إليكم التصحيح الخاص بـ 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 -T
للحصول على نتيجة رسومات ASCII بدلاً من نافذة gnuplot.
أيضًا، شرارة هو رسم بياني شريطي صغير لطيف في الصدفة الخاصة بك.