Python 在matplotlib图形的交互式导航中保留缩放设置

Python 在matplotlib图形的交互式导航中保留缩放设置,python,plot,matplotlib,tkinter,zooming,Python,Plot,Matplotlib,Tkinter,Zooming,是否有办法保留地物的交互式导航设置,以便下次更新地物时,缩放/平移特征不会返回默认值?更具体地说,如果放大一个地物,然后更新绘图,是否可以使新地物显示为与前一个地物相同的缩放设置?我正在使用Tkinter。您需要更新图像,而不是每次都创建新图像。例如: import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import Button class DummyPlot(object): def

是否有办法保留地物的交互式导航设置,以便下次更新地物时,缩放/平移特征不会返回默认值?更具体地说,如果放大一个地物,然后更新绘图,是否可以使新地物显示为与前一个地物相同的缩放设置?我正在使用Tkinter。

您需要更新图像,而不是每次都创建新图像。例如:

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

我找到了一个名为
get\u navigate\u mode()
的方法,但我不知道如何使用它。您如何更新绘图?如果操作正确(例如,
line.set_data
),它会完全按照您的要求执行…我的绘图由我使用
imshow()创建的颜色贴图组成。当我按下按钮时,该图形出现。对于更新,我指的是再次按下相同的按钮。但是,如何更新图像?您是使用
imshow
重新创建它还是更新绘图?(即
im=plt.imshow()
然后
im.set\u data(新数据)
)我用来创建图像和更新绘图的按钮是相同的。如果我使用
im=plt.imshow()
然后使用
im.set\u数据(新数据)
它不会保留导航面板的设置(就像它在创建一个新图形)。在按下按钮之前,我尝试过使用
imshow
,但之后我无法使用
set\u data
draw()
谢谢,举个例子就清楚多了。我想我的错误是,我希望能够使用相同的按钮创建和更新图形。换句话说,当程序启动时,我看不到当我按下按钮时出现的图形。再次按下按钮后,将使用新数据(有时是新的轴标签)更新同一图形。在这种情况下,可以使用虚拟数据生成图像,或者每次生成新图像,但禁用自动缩放。看看这两个新例子。希望有帮助!谢谢,这真的很有帮助!我想我只需要改变我剧本的结构。事实上,图形窗口是在我按下按钮时创建的,稍后我将使用该按钮更新图形。在您建议我的情况下,在我按下按钮之前已经创建了“体形”窗口,这就是为什么我无法使用
set\u data
。使用您的解决方案,绘图速度会快得多,但当我按下按钮时,图形窗口必须已经存在!好的,如果您确实希望每次都有一个全新的图形窗口(但放大到上一个区域),您可以跟踪最后一个范围(
extent=ax.axis()
),然后在放置新图形时设置它(
ax.axis(extent)
)。另一方面,就像你说的,从长远来看,稍微改变一下代码的结构可能更好。是的,我可能会稍微改变一下我的结构。非常感谢你的帮助!