web-dev-qa-db-ja.com

ターミナルでチャートをプロットする方法は?

私は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)

これはこのチャートを生成します:

enter image description here そして、サーバー上で実行しようとすると、サーバーではコマンド行だけが画面に表示されず、次のエラーが表示されます。

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

コマンドラインでチャートとグラフを表示する方法/メソッド/関数はありますか?

7
Rich

ここにはいくつかのオプションがあります。

  1. 画像または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')
    
  2. サーバーがX11転送をサポートしている場合(またはX11転送を有効化/インストールできる場合)は、ディスプレイを設定してサーバーにSSH接続できます。 Linuxから次を実行:

    DISPLAY=:0.0 ssh -Y <server ip>
    

    これにより、サーバーからのディスプレイ出力をPCに転送するようにマシンが設定されます。 Windowsを実行している場合は、簡単にするMobaXtermを使用するか、X11クライアントを自分で構成できます。私が正しく覚えていれば、Macも同様に簡単です。

7
Sagnik Ghosh

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
20
Nico Schlömer

リストから縦棒グラフを作成する 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])

picture

5
William234234

チャートで外部ウィンドウをポップしたい場合は、プロットを実行してから

>>> matplotlib.pyplot.show(block=True)

これにより、グラフが別のウィンドウに表示されます。

この呼び出しの前にplot()を数回呼び出すと、それぞれのチャートで同じ量のウィンドウがポップされます。コントロールは、Python=に戻ります。ポップされたすべてのチャートウィンドウを閉じた場合のみです。

私はそれを次のように小さなヘルパー関数でラップするのが好きです:

_def show():
   return matplotlib.pyplot.show(block=True) 
_

次に、まだ表示されていないプロットを表示したいときはいつでも、show()を呼び出します。

3
Jay

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)

enter image description here

2
Ash

パッケージ 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)
1