Octaveを使用すると、配列を端末にプロットできます。たとえば、関数x^2
の値を持つ配列をプロットすると、この出力が端末に表示されます。
10000 ++---------+-----------+----------+-----------+---------++
++ + + + + ++
|+ : : : : +|
|++ : : : : ++|
| + : : : : + |
| ++ : : : : ++ |
8000 ++.+..................................................+.++
| ++ : : : : ++ |
| ++ : : : : ++ |
| + : : : : + |
| ++ : : : : ++ |
| + : : : : + |
6000 ++....++..........................................++....++
| ++ : : : : ++ |
| + : : : : + |
| ++ : : : : ++ |
| ++: : : :++ |
4000 ++........++..................................++........++
| + : : + |
| ++ : : ++ |
| :++ : : ++: |
| : ++ : : ++ : |
| : ++ : : ++ : |
2000 ++.............++........................++.............++
| : ++ : : ++ : |
| : +++ : : +++ : |
| : ++ : : ++ : |
| : +++: :+++ : |
+ + ++++ ++++ + +
0 ++---------+-----------+----------+-----------+---------++
0 20000 40000 60000 80000 100000
Pythonで似たようなこと、特にmatplotlibを使って何かできる方法はありますか? bashplotlibはこの機能の一部を提供しているように見えますが、Octaveの提供と比較すると非常に基本的なようです。
すでにいくつかの回答が示唆しているように、gnuplot
は素晴らしい選択です。
ただし、gnuplotサブプロセスを呼び出す必要はありません。python gnuplotlib
ライブラリーを使用する方がはるかに簡単かもしれません。
例(from: https://github.com/dkogan/gnuplotlib ):
>>> import numpy as np
>>> import gnuplotlib as gp
>>> x = np.linspace(-5,5,100)
>>> gp.plot( x, np.sin(x) )
[ graphical plot pops up showing a simple sinusoid ]
>>> gp.plot( (x, np.sin(x), {'with': 'boxes'}),
... (x, np.cos(x), {'legend': 'cosine'}),
... _with = 'lines',
... terminal = 'dumb 80,40',
... unset = 'grid')
[ ascii plot printed on STDOUT]
1 +-+---------+----------+-----------+-----------+----------+---------+-+
+ +|||+ + + +++++ +++|||+ + +
| |||||+ + + +|||||| cosine +-----+ |
0.8 +-+ |||||| + + ++||||||+ +-+
| ||||||+ + ++||||||||+ |
| ||||||| + ++||||||||| |
| |||||||+ + ||||||||||| |
0.6 +-+ |||||||| + +||||||||||+ +-+
| ||||||||+ | ++||||||||||| |
| ||||||||| + ||||||||||||| |
0.4 +-+ ||||||||| | ++||||||||||||+ +-+
| ||||||||| + +|||||||||||||| |
| |||||||||+ + ||||||||||||||| |
| ||||||||||+ | ++||||||||||||||+ + |
0.2 +-+ ||||||||||| + ||||||||||||||||| + +-+
| ||||||||||| | +||||||||||||||||+ | |
| ||||||||||| + |||||||||||||||||| + |
0 +-+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-+
| + ||||||||||||||||||+ | ++|||||||||| |
| | +||||||||||||||||| + ||||||||||| |
| + ++|||||||||||||||| | +|||||||||| |
-0.2 +-+ + ||||||||||||||||| + ||||||||||| +-+
| | ++||||||||||||||+ | ++||||||||| |
| + ||||||||||||||| + ++|||||||| |
| | +|||||||||||||| + ||||||||| |
-0.4 +-+ + ++||||||||||||+ | +|||||||| +-+
| + ||||||||||||| + ||||||||| |
| | +|||||||||||+ + ++||||||| |
-0.6 +-+ + ++|||||||||| | +||||||| +-+
| + ||||||||||| + ++|||||| |
| + +|||||||||+ + ||||||| |
| + ++|||||||| + +++||||| |
-0.8 +-+ + + ++||||||+ + + +||||| +-+
| + + +|||||| + + ++|||| |
+ + + ++ ++|||++ + + ++ + + ++||| +
-1 +-+---------+----------+-----------+-----------+----------+---------+-+
-6 -4 -2 0 2 4 6
@Benjamin Barenblatが指摘したように、現在matplotlibを使用する方法はありません。純粋なpythonライブラリを使用したい場合は、 ASCII Plotter を確認できます。ただし、上記でコメントしたように、 gnuplot を使用します= this の質問などで提案されているとおり。
pythonから直接gnuplotを使用するには、 Gnuplot.py (これはまだテストしていません)を使用するか、スクリプトインターフェイスでgnuplotを使用します。 (提案通り ここ )のように:
import numpy as np
x=np.linspace(0,2*np.pi,10)
y=np.sin(x)
import subprocess
gnuplot = subprocess.Popen(["/usr/bin/gnuplot"],
stdin=subprocess.PIPE)
gnuplot.stdin.write("set term dumb 79 25\n")
gnuplot.stdin.write("plot '-' using 1:2 title 'Line1' with linespoints \n")
for i,j in Zip(x,y):
gnuplot.stdin.write("%f %f\n" % (i,j))
gnuplot.stdin.write("e\n")
gnuplot.stdin.flush()
これは次のようなプロットを与えます
1 ++--------+---A******---------+--------+---------+---------+--------++
+ + ** +A* + + + Line1 **A*** +
0.8 ++ ** * ++
| ** ** |
0.6 ++ A * ++
| * * |
0.4 ++ * ++
| ** A |
0.2 ++* * ++
|* * |
0 A+ * A ++
| * * |
-0.2 ++ * * ++
| A* ** |
-0.4 ++ * * ++
| ** * |
-0.6 ++ * A ++
| * ** |
-0.8 ++ ** ++
+ + + + + A****** ** + +
-1 ++--------+---------+---------+--------+--------A+---------+--------++
0 1 2 3 4 5 6 7
いくつかのスタイリングオプションがあります。 ここ 。
プロットについては、SympyのTextBackend
を試すこともできます。 doc を参照してください。または、単にtextplot
を使用します。
ここに例があります
from sympy import symbols
from sympy.plotting import textplot
x = symbols('x')
textplot(x**2,0,5)
出力付き
24.0992 | /
| ..
| /
| ..
| ..
| /
| ..
| ..
12.0496 | ---------------------------------------..--------------
| ...
| ..
| ..
| ...
| ...
| ...
| .....
| .....
0 | .............
0 2.5 5
簡単な概要が必要なだけで、X軸の間隔が均等である場合は、自分でいくつかのクイックASCII出力を作成することもできます。
In [1]: y = [20, 26, 32, 37, 39, 40, 38, 35, 30, 23, 17, 10, 5, 2, 0, 1, 3,
....: 8, 14, 20]
In [2]: [' '*(d-1) + '*' for d in y]
Out[2]:
[' *',
' *',
' *',
' *',
' *',
' *',
' *',
' *',
' *',
' *',
' *',
' *',
' *',
' *',
'*',
'*',
' *',
' *',
' *',
' *']
y
- dataが整数でない場合、それらが機能する範囲内に収まるようにオフセットおよびスケーリングします。たとえば、上記の数値は基本的に( sin(x)+1 )*20
。
asciiplotlib をリリースしたばかりです。折れ線グラフの場合、gnuplotとtermiplotをインストールする必要があります。
pip3 install asciiplotlib
この後、ラインプロットが生成されます。
import asciiplotlib as apl
import numpy
x = numpy.linspace(0, 2 * numpy.pi, 10)
y = numpy.sin(x)
fig = apl.figure()
fig.plot(x, y, label="data", width=50, height=15)
fig.show()
1 +---------------------------------------+
0.8 | ** ** |
0.6 | * ** data ******* |
0.4 | ** |
0.2 |* ** |
0 | ** |
| * |
-0.2 | ** ** |
-0.4 | ** * |
-0.6 | ** |
-0.8 | **** ** |
-1 +---------------------------------------+
0 1 2 3 4 5 6 7
Matplotlibに制限されている場合、答えは現在いいえです。現在、matplotlibには多くの バックエンド がありますが、ASCIIはそれらの1つではありません。
参照: asciichart (Node.js、Python、Java、Go、Haskellで実装)