2012-03-28 40 views
2

有沒有辦法保留圖形的交互式導航設置,以便下次更新圖形時Zoom/Pan特性不會恢復爲默認值?更具體地說,如果放大圖形,然後我更新繪圖,是否可以使新圖形以前一個縮放設置相同的方式顯示?我正在使用Tkinter。保存matplotlib交互式導航中的縮放設置圖

+0

我發現了一個名爲'get_navigate_mode()'方法,但我不知道我該如何使用它 – maupertius 2012-03-28 13:16:02

+1

你是如何更新的情節?如果你正確地做到了這一點(例如'line.set_data'),它確實是你想要的... – 2012-03-28 13:21:58

+0

我的情節由我用'imshow()'創建的顏色映射組成。按下按鈕時會出現此圖。爲了更新我的意思是再次按下相同的按鈕。 – maupertius 2012-03-28 13:38:06

回答

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() 

如果你想繪製的第一次數據,當你點擊「更新」,一個解決辦法是先繪製虛擬數據,並使其不可見。

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 2012-03-29 14:29:36

+0

在這種情況下,您可以製作帶有虛擬數據的圖像,或者每次製作新圖像但關閉自動縮放。看看這兩個新例子。希望有所幫助! – 2012-03-29 14:51:47

+0

謝謝,這真的有幫助!我想我只需要改變腳本的結構。實際上,當我按下我想用來更新圖形的按鈕時,會創建數字窗口。在你提示我的情況下,在按下按鈕之前已經創建了數字窗口,這就是爲什麼我無法使用'set_data'。隨着你的解決方案的繪圖將更快,但數字窗口必須已經在那裏,當我按下按鈕 – maupertius 2012-03-29 15:09:41