matplotlib.pyplot事件处理:按键停留时间的线性增加?

时间:2014-12-16 07:02:26

标签: numpy matplotlib event-handling

我正在使用matplotlib.pyplot和numpy后端在Python中编写一个图像处理模块。 图像将主要采用tiff格式,因此下面的代码使用tifffile将3D图像文件转换为numpy中的4D数组。下面的代码旨在使用z和x作为热键,一次移动3D图像的z平面,一次一个图像。我的问题非常有趣,我无法弄明白:事件和动作之间的时间(按x并显示z + 1图像)每次事件的时间都是两倍。 我计时了,结果如下: 第一次按压:0.124秒 第二个z-prss:0.250秒 第三次z-press:0.4875 s

这是一个真正的线性增长,但我无法找到我的代码中的错误。

import matplotlib.pyplot as plt
import numpy as np
import tifffile as tiff

class Image:
    def __init__ (self, fname):
        self.fname = fname
        self.fig = plt.figure()
        self.z = 0
        self.ax = self.fig.add_subplot(111)
        self.npimg = tiff.imread(self.fname)
        self.plotimg()
        self.connect()

    def plotimg(self):
        plt.imshow(self.npimg[self.z][0])
        plt.show()

    def connect(self):
        self.cidkeypress = self.fig.canvas.mpl_connect('key_press_event',self.keypress)

    def disconnect(self):
        self.fig.canvas.mpl_disconnect(self.cidkeypress)

    def keypress(self, event):
        if event.key == 'x':
            self.z += 1
            self.plotimg()
        elif event.key == 'z':
            self.z -= 1
        self.plotimg()

1 个答案:

答案 0 :(得分:0)

由于您没有提供示例文件,因此我无法测试您的代码。但我认为问题是,你反复打电话给plt.imshow()。每次将新的AxesImage对象添加到图中。这就是时间线性增加的原因。

所以解决方案是只有一个AxesImage对象并且只更新数据。如下调整__init__plotimg

def __init__ (self, fname):
    self.fname = fname
    self.fig = plt.figure()
    self.z = 0
    self.ax = self.fig.add_subplot(111)
    self.npimg = tiff.imread(self.fname)
    self.pltim = plt.imshow(self.npimg[self.z][0])
    self.connect()
    plt.show()

def plotimg(self):
    self.pltim.set_data(self.npimg[self.z][0])
    plt.draw()

注意:未经测试的代码!

编辑:

plt.imshowplt.show之间的差异:

尽管它们名称相似,但它们做的事情却截然不同:plt.imshow是一个绘图功能,它将图像绘制到当前轴(类似于plt.plotplt.scatter等) plt.show然而,在屏幕上显示图形并进入后端主循环(即阻止您的代码)。 This answer更详细地解释了