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

提问

有没有一种方法可以保留图形的交互式导航设置,以使下次更新图形时,缩放/平移特性不会回到默认值?更具体地说,如果缩放某个图形,然后更新绘图,是否可以使新图形以与上一个图形相同的缩放设置显示?我正在使用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()
评论