私はML/Theanoを研究していて、最近このスクリプトに遭遇しました: https://Gist.github.com/notmatthancock/68d52af2e8cde7fbff1c9225b2790a7f これはクールでしたと遊ぶ。そして、すべてのML研究者と同様に、最近サーバーにアップグレードしましたが、サーバーの方が強力ですが、問題も抱えていました。
スクリプトは非常に長いですが、次のコードで終わります:
def plot_stuff(inputs, outputs, losses, net_func, n_hidden):
fig,axes = plt.subplots(1,2,figsize=(12,6))
axes[0].plot(np.arange(losses.shape[0])+1, losses)
axes[0].set_xlabel('iteration')
axes[0].set_ylabel('loss')
axes[0].set_xscale('log')
axes[0].set_yscale('log')
x,y = np.mgrid[inputs[:,0].min():inputs[:,0].max():51j, inputs[:,1].min():inputs[:,1].max():51j]
z = net_func( np.c_[x.flatten(), y.flatten()] ).reshape(x.shape)
axes[1].contourf(x,y,z, cmap=plt.cm.RdBu, alpha=0.6)
axes[1].plot(inputs[outputs==0,0], inputs[outputs==0,1], 'or')
axes[1].plot(inputs[outputs==1,0], inputs[outputs==1,1], 'sb')
axes[1].set_title('Percent missclassified: %0.2f%%' % (((net_func(inputs)>0.5) != outputs.astype(np.bool)).mean()*100))
fig.suptitle('Shallow net with %d hidden units'%n_hidden)
plt.show()
if __name__=='__main__':
n_hidden = 40
inputs, outputs = gen_data(n_samples_per_class=100)
losses, net_func = train_neural_network(inputs=inputs, outputs=outputs, n_hidden=n_hidden, n_iters=int(2000), learning_rate=0.1)
plot_stuff(inputs, outputs, losses, net_func, n_hidden)
これはこのチャートを生成します:
そして、サーバー上で実行しようとすると、サーバーではコマンド行だけが画面に表示されず、次のエラーが表示されます。
Fedora@ip-173-33-18-911:~/scripting/spiral$ python spiral.py
Iteration 2000 / 2000, Loss: 0.172083
Traceback (most recent call last):
File "spiral.py", line 133, in <module>
plot_stuff(inputs, outputs, losses, net_func, n_hidden)
File "spiral.py", line 110, in plot_stuff
fig,axes = plt.subplots(1,2,figsize=(12,6))
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 1046, in subplots
fig = figure(**fig_kw)
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 423, in figure
**kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 79, in new_figure_manager
return new_figure_manager_given_figure(num, figure)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 87, in new_figure_manager_given_figure
window = Tk.Tk()
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1767, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
コマンドラインでチャートとグラフを表示する方法/メソッド/関数はありますか?
ここにはいくつかのオプションがあります。
画像またはPDFにエクスポートします。ここにある情報: http://matplotlib.org/faq/howto_faq.html ここで重要な情報は以下の通りです:
# do this before importing pylab or pyplot
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3])
fig.savefig('test.png')
サーバーがX11転送をサポートしている場合(またはX11転送を有効化/インストールできる場合)は、ディスプレイを設定してサーバーにSSH接続できます。 Linuxから次を実行:
DISPLAY=:0.0 ssh -Y <server ip>
これにより、サーバーからのディスプレイ出力をPCに転送するようにマシンが設定されます。 Windowsを実行している場合は、簡単にするMobaXtermを使用するか、X11クライアントを自分で構成できます。私が正しく覚えていれば、Macも同様に簡単です。
termplotlib (私の小さなプロジェクト)がここで役に立つかもしれません。でインストール
pip3 install termplotlib
のようなターミナルプロットを作成します
import termplotlib as tpl
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x) + x
fig = tpl.figure()
fig.plot(x, y, width=60, height=20)
fig.show()
7 +---------------------------------------------------+
| |
6 | ** |
| ** |
| ** |
5 | ** |
| *** |
4 | **** |
| ***** |
3 | ***************** |
| **** |
2 | *** |
| *** |
| *** |
1 | ** |
|** |
0 +---------------------------------------------------+
0 1 2 3 4 5 6 7
リストから縦棒グラフを作成する termplot
という小さなパッケージを作成しました。
pip install termplot
import termplot
termplot.plot([1,2,3,4,-5,5,-4,-1,0,-10,-4,-2,3,5,8,10,12,10,8,7,6,5,4,3,2,1])
チャートで外部ウィンドウをポップしたい場合は、プロットを実行してから
>>> matplotlib.pyplot.show(block=True)
これにより、グラフが別のウィンドウに表示されます。
この呼び出しの前にplot()
を数回呼び出すと、それぞれのチャートで同じ量のウィンドウがポップされます。コントロールは、Python=に戻ります。ポップされたすべてのチャートウィンドウを閉じた場合のみです。
私はそれを次のように小さなヘルパー関数でラップするのが好きです:
_def show():
return matplotlib.pyplot.show(block=True)
_
次に、まだ表示されていないプロットを表示したいときはいつでも、show()
を呼び出します。
terminalplot は、@ William234234によって提案されたパッケージよりもはるかに完全であるように思えます。
使用例:
import terminalplot as tp
import numpy as np
from math import sin, pi
x=np.linspace(0,2*pi,100);
y=[sin(m)+m for m in x];
tp.plot(list(x),y)
パッケージ plotext を確認してください。これにより、python3を使用して端末に直接データをプロットできます。
基本的な例を次に示します。
••••• │
••• •• ├15
•• •• │
• •• │
•• •• │
•• •• ••••• │
• •• •••• •••• ├10
•• • •• ••• │
• •• ••• •• │
•• •• •• ••• │
• •• •• ••• •••│
•• •• ••• •••• ├5
• •• ••••••••••• │
•• ••• │
•• •• │
•• ••• │
•••••• ├0
┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬──────┘
0 10 20 30 40 50 60 70
x = 39.461 × x-axis - 0.000 ± 19.730
y = 0.087 × y-axis - 0.559 ± 0.043
次のコマンドでインストールできます。
Sudo -H pip3 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 = 20, cols = 100, equations = True, point_color = 'blue')
plx.show(clear = 0)