0

背景:私はデータ処理アプリケーションを使用しており、matplotlibをtkinterGUIに埋め込んだ2D配列を視覚化しようとしています。ユーザー入力(つまり、表示するフレーム、その他のさまざまなオプション)を収集して、matplotlibの図を更新しようとしているので、事前にアニメーションを生成したくありません。

システム: Windows XP、Python 2.7、matplotlib 1.1.1rc

質問:カラーバーではなく、imshowによって生成された画像のみを更新するにはどうすればよいですか?

GUI GUIスナップショット カラーバーがどのように上書きされるかに注目してください。

コード: 注:以下のコードはテストされていませんが、現在のコードがどのように設定されているかについての基本的な考え方です。

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
import Tkinter as tk
import numpy as np


class MainWindow:
    def __init__(self,application):
        self.mainframe=tk.Frame(application)

        #update button
        ttk.Button(application,text='Update',command=self.update).pack()

        #matplotlib setup
        self.ren2DFig=plt.figure(figsize=(4,4),dpi=100)
        self.renCanvas=FigureCanvasTkAgg(self.ren2DFig,master=self.renWin2D)
        self.renCanvas.show()
        self.renCanvas.get_tk_widget().pack()

        self.subPlot=self.ren2DFig.add_subplot(111)
        self.subPlot.get_yaxis().set_visible(False)
        self.subPlot.get_xaxis().set_visible(False)
        self.subPlot.get_axes().set_frame_on(False)
        frame=np.zeros((20,40),)
        frame[9:11 ,9:11]=1
        frame[5 ,5]=.5
        self.im=self.subPlot.imshow(self.rotate(frame), origin = 'lower')
        self.cbar=self.ren2DFig.colorbar(self.im)
        self.cbar.set_label('Solid Fraction')
        self.renCanvas.draw()
        self.ren2DFig.canvas

    def update(self):
        self.im.set_array(np.zeros((20,40),))
        self.renCanvas.draw() # I think this is the problem?

application=tk.Tk()
application.focus_force()
window=MainWindow(application)
application.protocol("WM_DELETE_WINDOW",window.close)
application.mainloop()

どんな助けでも大歓迎です!ありがとう!

更新[2012年7月13日]:

サブプロットをクリアしてから、画像とカラーバーを追加し直して、最後にキャンバスを再描画すると、次のようになります。

matplotlib

一体何が間違っているのか?????? これは本当に私を苛立たせ始めています。

4

2 に答える 2

1

私はそれを理解します。問題は

self.subPlot.get_axes().set_frame_on(False)

バグか何かだと思いますが、Trueに変更すると

self.subPlot.get_axes().set_frame_on(True)

それは問題なく動作し、すべてが通常のように更新されます。

この小さなことは私を2日間困惑させました!!! 図に行きます。笑。

于 2012-07-13T15:04:25.163 に答える
0

私はあなたが見ている行動を見ていません:

import matplotlib.pyplot as plt
import numpy

plt.ion()

data = numpy.arange(12).reshape(3, 4)
im = plt.imshow(data)
plt.colorbar(im)
im.set_array(5-data)
# re-draw now that we have changed the data array
plt.draw()

カラーバーを変更せずに画像を更新します。あなたが抱えている問題についてさらに説明していただけますか?

于 2012-07-12T13:09:16.727 に答える