2012-03-28 14 views
2

Gibt es eine Möglichkeit, die interaktiven Navigationseinstellungen einer Figur so beizubehalten, dass beim nächsten Aktualisieren der Figur die Zoom/Pan-Eigenschaften nicht auf die Standardwerte zurückgesetzt werden? Um genauer zu sein: Wenn ich eine Figur zoome, und dann die Grafik aktualisiere, ist es möglich, dass die neue Figur mit den gleichen Zoomeinstellungen wie die vorherige erscheint? Ich benutze Tkinter.Zoomeinstellungen in der interaktiven Navigation von Matplotlib beibehalten Abbildung

+0

fand ich eine Methode namens 'get_navigate_mode()' aber ich habe keine Ahnung, wie ich es – maupertius

+1

verwenden Wie werden Sie den Plot zu aktualisieren? Wenn Sie es richtig machen (z. B. 'line.set_data'), tut es genau das, was Sie wollen ... –

+0

Mein Plot besteht aus einer Colormap, die ich mit' imshow() 'erstellt habe. Die Figur erscheint, wenn ich einen Knopf drücke. Für die Aktualisierung bedeute ich das Drücken derselben Taste erneut. – maupertius

Antwort

4

Sie müssen das Bild aktualisieren, anstatt jedes Mal ein neues Bild zu erstellen. Als Beispiel:

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

Wenn Sie die Daten zum ersten Mal zeichnen möchten, wenn Sie „update“ treffen, ist ein Work-around ersten Dummy-Daten zu zeichnen und sie unsichtbar machen.

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

Alternativ können Sie die automatische Skalierung deaktivieren und jedes Mal ein neues Bild erstellen. Dies wird jedoch deutlich langsamer sein.

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

Danke, es ist viel klarer mit einem Beispiel. Mein Fehler ist wohl, dass ich den Graphen mit derselben Schaltfläche erstellen und aktualisieren möchte. Mit anderen Worten, wenn das Programm startet, sehe ich nicht die Grafik, die erscheint, wenn ich eine Taste drücke. Die gleiche Grafik wird nach erneutem Drücken der Taste mit neuen Daten (und manchmal neuen Achsenbeschriftungen) aktualisiert. – maupertius

+0

In diesem Fall könnten Sie ein Bild mit Dummy-Daten erstellen oder jedes Mal ein neues Bild erstellen, aber die automatische Skalierung deaktivieren. Sehen Sie sich die beiden neuen Beispiele an. Ich hoffe, das hilft! –

+0

Danke, das hilft wirklich! Ich denke, ich muss nur die Struktur meines Skripts ändern. Tatsächlich wird das Figurenfenster erstellt, wenn ich den Knopf drücke, den ich später verwenden möchte, um das Diagramm zu aktualisieren. In dem Fall, dass Sie mich vorgeschlagen haben, ist das Zahlenfenster bereits erstellt, bevor ich den Knopf drücke, und deshalb konnte ich 'set_data' nicht verwenden. Mit Ihrer Lösung wird das Plotten viel schneller, aber das Zahlenfenster muss schon da sein, wenn ich den Knopf – maupertius

Verwandte Themen