1. ホーム
  2. python

[解決済み] pyplotのウィンドウを閉じる

2022-02-01 01:33:58

質問

最終編集です。

pyplotのウィンドウを閉じるというテーマで私が見つけたのは、おそらくpyplotを使用してはいけないということです。 SRKは、以下の彼の回答で更新されるプロットを処理する方法についての素晴らしい例を示しています。 また、私はTkinterウィンドウにpyplotのプロットを置く方法を偶然見つけました。Tkinterはpyplotよりもウィンドウのオープンとクローズに長けています。 これは は、Tkウィンドウにpyplotプロットを配置する方法です。 また これは良い例です .

/最終編集

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

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

解決方法は?

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

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

plt.close(plot1) は、インスタンス plot1 を持つ図を閉じます。

plt.close('all') はすべてのフィーチャーを閉じます

発見 ここで .

次のことを忘れないでください。 plt.show() ブロッキング 関数を使うので、上で使った例のコードでは plt.close() はウィンドウを閉じるまで実行されないので、冗長になっています。

を使用することができます。 plt.ion() をコードの先頭に置くと、ノンブロッキングになります。ただし、これには別の意味があります。

コメントでの議論の後、plot機能がどのように使用されるかを示すために、ちょっとした例をまとめました。

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

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) は ydata を変更します。 プロパティ ライン2D オブジェクトをハンドル 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つに変更を加えると、メモリからupdate関数が実行されます(と思うのですが?)

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