2

私は完全なmatplotlibの初心者です。現時点では、サンプルプログラムに小さな変更を加えて何が起こるかを確認し、広範囲にわたるが順序付けられていないドキュメントを理解しようとしています。

既存のtkguiベースのPythonプログラムにグラフ表示を追加しようとしています。グラフが新しいウィンドウに表示されるのは非常にうれしいです。tkに埋め込む必要はありません(まだ、来週かもしれません)。

既存のプログラムには、ユーザーが押すtk.Buttonがあります。このボタンは、一部のデータを取得し、一部のラベルの最大/最小/平均を更新する関数を呼び出します。

ラベルを更新するだけでなく、データのグラフもポップアップするように機能を強化したいと思います。グラフがすでに存在する場合は、次のボタンを押すと、古いトレースが新しいトレースに置き換えられ、軸が再自動スケーリングされます。ユーザーがグラフウィンドウを閉じると、次のボタンを押すと新しいグラフウィンドウがポップアップ表示されます。

すべてのプレスで新鮮なグラフを作成するのは簡単で、self.figテストではないにしても1つになりました。plt.clf()を追加するまで、永続的なトレースを追加しました。ただし、ユーザーがグラフウィンドウを閉じた場合、以下のコードはグラフウィンドウを再作成しません。self.figでテストするのではなく、グラフが表示されているか、グラフが存在するかなどが必要だと思います。それとも、私はそれを行うための明白な方法を逃したかもしれません、そしてはるかに良い方法がありますか?感謝します。

import Tkinter as tk
import os, sys
import numpy as np
import numpy.random as npr
import matplotlib.pyplot as plt

class Plotter():
    def __init__(self):
        self.fig=None
        self.ax=None    

    def do_stuff(self):
        # make plausible data
        a=np.arange(0,3,0.1)
        b=npr.random(1)
        c=np.power(a,b)            

        if not self.fig:
            self.fig = plt.figure()
        else:
            plt.clf()

        self.ax = self.fig.add_subplot(111)
        self.ax.plot(a,c,'k--')
        self.ax.set_yticklabels([])
        self.ax.set_xticklabels([])

        plt.show()


p=Plotter()
root=tk.Tk()

rt = tk.Button(root, text='Capture', command=p.do_stuff)
rt.grid(row=0, column=0)

qt = tk.Button(root, text='quit', command=sys.exit)
qt.grid(row=1, column=0)

root.mainloop()
4

1 に答える 1

0

新しい解決策で編集:別の解決策はpyplot.fignum_exists、フィギュアがまだ存在するかどうかを確認するために使用することです。だからあなたはすることができます:

if self.fig is None or not pyplot.fignum_exists(self.fig.number):
    self.fig = pyplot.figure()
# self.fig will now be active, either via an old still-open figure or a newly-created one

後世のための古い解決策:

問題は、Figureを閉じてもself.fig、そのFigureオブジェクトが役に立たなくなるものの、に影響を与えないということです。1つのオプションは、「現在の数値を取得」を表すのpyplot.gcf()代わりに使用することです。pyplot.figure()これにより、開いている場合は既存の図が返され、アクティブな図がない場合は新しい図が作成されます。したがって、do_stuffメソッドで使用するpyplot.gcf()と、古いFigureオブジェクトまたは新しいFigureオブジェクトが返され、どちらを気にする必要はありません。だから、ただやってください:

def do_stuff(self):
    # make plausible data
    fig = pyplot.gcf()
    fig.clf()
    self.ax = fig.add_subplot(111)
    # etc.

これには明らかに制限があります。特に、プログラムの他の部分でもmatplotlibフィギュアを作成または使用する場合gcf、「現在の」フィギュアは他の関数が作成した他のフィギュアである可能性があるため、使用すると奇妙な結果が生じる可能性があります。しかし、あなたが今していることについては、これは実行可能な解決策のようです。

于 2012-09-19T18:09:36.343 に答える