2012-03-28 50 views
2

Figureの対話型ナビゲーション設定を保存して、次にFigureが更新されるときにズーム/パンの特性がデフォルト値に戻らないようにする方法はありますか?具体的には、図を拡大してからプロットを更新すると、前の図と同じ拡大設定で新しい図形を表示させることは可能ですか?私はTkinterを使用しています。matplotlibのインタラクティブナビゲーションでズーム設定を保持する図

+0

私は、 ')' get_navigate_mode(と呼ばれる方法を見つけましたが、私は、私はどのようにしてプロットを更新している – maupertius

+1

それをどのように使用できるか分かりませんか?あなたが正しく(例えば 'line.set_data'など)それをしているなら、それはあなたが望むものを正確に行います。 –

+0

私のプロットは' imshow() 'で作成したカラーマップで構成されています。ボタンを押すと図が表示されます。更新のために、同じボタンをもう一度押すことを意味します。 – maupertius

答えて

4

毎回新しい画像を作成する代わりに、画像を更新する必要があります。例として:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Button 

class DummyPlot(object): 
    def __init__(self): 
     self.imsize = (10, 10) 
     self.data = np.random.random(self.imsize) 

     self.fig, self.ax = plt.subplots() 
     self.im = self.ax.imshow(self.data) 

     buttonax = self.fig.add_axes([0.45, 0.9, 0.1, 0.075]) 
     self.button = Button(buttonax, 'Update') 
     self.button.on_clicked(self.update) 

    def update(self, event): 
     self.data += np.random.random(self.imsize) - 0.5 
     self.im.set_data(self.data) 
     self.im.set_clim([self.data.min(), self.data.max()]) 
     self.fig.canvas.draw() 

    def show(self): 
     plt.show() 

p = DummyPlot() 
p.show() 

あなたは「更新」を打つ初めてデータをプロットしたい場合は、1つのワークアラウンドは、第1のダミーデータをプロットし、それが見えないようにすることです。

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Button 

class DummyPlot(object): 
    def __init__(self): 
     self.imsize = (10, 10) 
     self.data = np.random.random(self.imsize) 
     self.fig, self.ax = plt.subplots() 

     dummy_data = np.zeros(self.imsize) 
     self.im = self.ax.imshow(dummy_data) 
     self.im.set_visible(False) 

     buttonax = self.fig.add_axes([0.45, 0.9, 0.1, 0.075]) 
     self.button = Button(buttonax, 'Update') 
     self.button.on_clicked(self.update) 

    def update(self, event): 
     self.im.set_visible(True) 
     self.data += np.random.random(self.imsize) - 0.5 
     self.im.set_data(self.data) 
     self.im.set_clim([self.data.min(), self.data.max()]) 
     self.fig.canvas.draw() 

    def show(self): 
     plt.show() 

p = DummyPlot() 
p.show() 

代わりに、自動スケーリングをオフにして、毎回新しい画像を作成することもできます。しかし、これはかなり遅くなります。

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Button 

class DummyPlot(object): 
    def __init__(self): 
     self.imsize = (10, 10) 
     self.fig, self.ax = plt.subplots() 

     self.ax.axis([-0.5, self.imsize[1] - 0.5, 
         self.imsize[0] - 0.5, -0.5]) 
     self.ax.set_aspect(1.0) 
     self.ax.autoscale(False) 

     buttonax = self.fig.add_axes([0.45, 0.9, 0.1, 0.075]) 
     self.button = Button(buttonax, 'Update') 
     self.button.on_clicked(self.update) 

    def update(self, event): 
     self.ax.imshow(np.random.random(self.imsize)) 
     self.fig.canvas.draw() 

    def show(self): 
     plt.show() 

p = DummyPlot() 
p.show() 
+0

ありがとうございます。私の間違いは、同じボタンでグラフを作成して更新できるようにしたいということです。言い換えると、プログラムが起動すると、ボタンを押すと表示されるグラフが表示されません。もう一度ボタンを押すと、同じグラフが新しいデータ(および場合によっては新しい軸ラベル)で更新されます。 – maupertius

+0

その場合は、ダミーデータで画像を作成するか、毎回新しい画像を作成して自動拡大をオフにすることができます。 2つの新しい例を見てみましょう。希望が助けてくれる! –

+0

本当に助けてくれてありがとう!私は自分のスクリプトの構造を変えなければならないと思う。実際、グラフを更新するために使用したいボタンを押すとFigureウィンドウが作成されます。あなたが私に提案した場合、ボタンを押す前にFigureウィンドウが既に作成されているので、set_dataを使用できませんでした。あなたのソリューションでは、プロットがはるかに高速になりますが、ボタンを押したときにFigureウィンドウが既に存在している必要があります – maupertius

関連する問題