web-dev-qa-db-ja.com

pyplotウィンドウを閉じる

最終編集:

Pyplotウィンドウを閉じるというテーマで私が見つけたのは、おそらくpyplotを使用して行うべきではないということです。 SRKは、以下の回答で更新されるプロットの処理方法に関する素晴らしい例を示しています。また、pplotプロットをTkinterウィンドウに配置する方法に出くわしました。Tkinterは、pyplotよりもウィンドウの開閉にずっと適しています。ここで Typウィンドウにプロットプロットを配置する方法です また これは良い例です

/最終編集

いくつかのプロットを表示し、いくつかのコード入力からそれらを個別に閉じ(画面から削除)できるようにしたいのですが、これを行うためのコード入力がわかりません。

以下は私がこれまでに試したことです。 showコマンドとcloseコマンドの位置をいじってみましたが、これから得た唯一の実際の結果は、いずれかのプロットが表示されないことですが、画面からプロットを削除することができませんでした。一時停止を作成するためにraw_input()を挿入しています。

編集:これらのプロットはTkinterのGUIから呼び出されており、その方向からこれを行うより良い方法があれば、私はそれを聞いてうれしいです。

どんな入力でも感謝します、ありがとう。

import matplotlib.pyplot as plt

a = range(0,10)
b = range(0,20,2)
c = range(0,30,3)
d = range(0,40,4)

plot1 = plt.figure()
plt.plot(a,b, 'r-o')

plt.show()

plt.close()

plot2 = plt.figure()
plt.plot(c,d, 'b-o')

plt.show()
plt.close() 

コードの編集:これも機能しませんでした。

plot1 = plt.figure(1)
plt.plot(a,b, 'r-o')

plot2 = plt.figure(2)
plt.plot(c,d, 'b-o')
#plt.close(1)
#this will prevent plot1 from being displayed
plt.show()
plt.close(1)  # or ('all') or (plot1)
35
deadstump

plt.close()は現在のインスタンスを閉じます。

plt.close(2)は図2を閉じます

plt.close(plot1)は、インスタンスplot1でFigureを閉じます

plt.close('all')はすべてのfiuresを閉じます

見つかった ここ

plt.show()blocking関数であるため、上記で使用したコード例では、plt.close()はウィンドウまで実行されていません。閉じているため、冗長です。

コードの先頭でplt.ion()を使用して、ブロックしないようにすることができますが、これには他の意味があります。

コメントで議論した後、プロット機能をどのように使用できるかを示すために、少し例を挙げました。

以下にプロットを作成します。

_fig = plt.figure(figsize=plt.figaspect(0.75))
ax = fig.add_subplot(1, 1, 1)
....
par_plot, = plot(x_data,y_data, lw=2, color='red')
_

この場合、上記のaxは、一対の軸のハンドルです。これらの軸に何かをしたいときはいつでも、axes(ax)を呼び出すことで、現在の軸のセットをこの特定のセットに変更できます。

_par_plot_は、line2Dインスタンスへのハンドルです。これはアーティストと呼ばれます。 ydataを変更するなど、行のプロパティを変更する場合は、このハンドルを参照して変更できます。

また、以下を実行してスライダーウィジェットを作成することもできます。

_axsliderA = axes([0.12, 0.85, 0.16, 0.075])
sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)
sA.on_changed(update)
_

最初の行はスライダーの新しい軸(axsliderAと呼ばれる)を作成し、2行目はスライダーインスタンスsAを作成します。これは軸に配置され、3行目は次の場合に呼び出す関数を指定しますスライダーの値が変更されます(update)。

更新機能は次のようになります。

_def update(val):
    A = sA.val
    B = sB.val
    C = sC.val
    y_data = A*x_data*x_data + B*x_data + C
    par_plot.set_ydata(y_data)
    draw()
_

par_plot.set_ydata(y_data)は、ハンドル_par_plot_を持つLine2Dオブジェクトのydatapropertyを変更します。

draw()関数は、軸のcurrentセットを更新します。

すべてを一緒に入れて:

_from pylab import *
import matplotlib.pyplot as plt
import numpy

def update(val):
    A = sA.val
    B = sB.val
    C = sC.val
    y_data = A*x_data*x_data + B*x_data + C
    par_plot.set_ydata(y_data)
    draw()


x_data = numpy.arange(-100,100,0.1);

fig = plt.figure(figsize=plt.figaspect(0.75))
ax = fig.add_subplot(1, 1, 1)
subplots_adjust(top=0.8)

ax.set_xlim(-100, 100);
ax.set_ylim(-100, 100);
ax.set_xlabel('X')
ax.set_ylabel('Y')

axsliderA = axes([0.12, 0.85, 0.16, 0.075])
sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)
sA.on_changed(update)

axsliderB = axes([0.43, 0.85, 0.16, 0.075])
sB = Slider(axsliderB, 'B', -30, 30.0, valinit=2)
sB.on_changed(update)

axsliderC = axes([0.74, 0.85, 0.16, 0.075])
sC = Slider(axsliderC, 'C', -30, 30.0, valinit=1)
sC.on_changed(update)

axes(ax)
A = 1;
B = 2;
C = 1;
y_data = A*x_data*x_data + B*x_data + C;

par_plot, = plot(x_data,y_data, lw=2, color='red')

show()
_

上記についての注意:アプリケーションを実行すると、show()がブロックされるまで、コードは(update関数をメモリに保存するように)順番に実行されます。スライダーの1つを変更すると、メモリーから更新機能が実行されます(と思いますか?)。

これがshow()がそのまま実装されている理由であり、データを処理する関数を使用してバックグラウンドで値を変更できます。

64
stanri