41

最終編集:

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

/最終編集

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

以下は、私がこれまでに試したことです。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)
4

2 に答える 2

78

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

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

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

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

ここにあります

これplt.show()ブロッキング関数であるため、上記で使用したコード例で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_plotline2D インスタンスへのハンドルです。これをアーティストと呼びます。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)

1 行目はスライダーの新しい軸を作成し ( と呼ばれ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()

は、ハンドルを持つLine2Dオブジェクトpar_plot.set_ydata(y_data)の ydataプロパティを変更します。par_plot

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

すべてを一緒に入れて:

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()

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

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

于 2012-06-21T15:16:37.817 に答える