3

Matplotlib の対話型プロットと、Python のコマンド ライン インターフェイス Cmd を組み合わせたいと思います。これどうやってするの?スレッドを使用できますか? 私は次のことを試しました:

from cmd import Cmd
import matplotlib.pylab as plt
from threading import Thread

class MyCmd(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(1,1,1)

    def do_foo(self, arg):
        self.ax.plot(range(10))
        self.fig.canvas.draw()

if __name__=='__main__':
    c = MyCmd()
    Thread(target=c.cmdloop).start()
    plt.show()

Figure ウィンドウが開き、実際に実行されるコマンドをコンソールに入力できます。「foo」コマンドを実行すると、Figure ウィンドウに描画されます。これまでのところ、すべて問題ありません。ただし、コンソールに再度入ると、コンソールがスタックしているように見え、新しいコマンド ウィンドウが表示されます。しかし、Figure ウィンドウをクリックすると、コンソールに新しいコマンド プロンプトが出力され、新しいコマンドを入力できます。2 つのループが実際にはインターリーブされていないようです。より良い、より一般的な方法はありますか?

4

2 に答える 2

3

機能するものを見つけましたが、かなり醜いです

from cmd import Cmd
import matplotlib.pylab as plt
from threading import Thread
import time

class MyCmd(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(1,1,1)

    def do_foo(self, arg):
        self.ax.plot(range(10))
        self.fig.canvas.draw()

if __name__=='__main__':
    plt.ion()
    c = MyCmd()
    def loop():
        while True:
            c.fig.canvas.draw()
            time.sleep(0.1)
    Thread(target=loop).start()
    c.cmdloop()

これは単に Figure の draw メソッドを定期的に呼び出すだけです。そうしないと、隠れていた図形が再び前面に出てきたときに、図形が再描画されません。

しかし、これは醜いようです。より良い方法はありますか?

于 2010-08-13T11:35:37.937 に答える
0

iPython はかなり人気があります。Using matplotlib in a python shell をご覧ください。

于 2010-11-08T01:09:08.343 に答える