matplotlib 1.3 中 plt.show() 阻塞问题

1 投票
1 回答
542 浏览
提问于 2025-04-29 07:12

我正在写一个程序,目的是在我点击的点上绘制一个样条曲线,使用的是matplotlib网站上提供的LineBuilder类(下面的代码中有我添加的注释来解释代码)。不过,我想在点击绘图窗口的某个区域时退出这个图形。我的代码在一台电脑上能正常工作(我想是matplotlib 1.2版本)。但在另一台电脑上(matplotlib 1.3版本),当我点击窗口的那个特定区域后,代码没有继续执行plt.show()之后的部分。相反,当我关闭我的图形界面时,它才会执行plt.show()之后的代码。

有没有人知道这可能是什么原因呢?我不太确定这个问题的具体情况。我知道如果我在plt.show()中把block=False打开,代码会继续执行,但我就无法构建我的线了,所以我觉得这可能和这个有关。不过我找不到这个设置是否有变化。代码如下:

from matplotlib import pyplot as plt
class LineBuilder:
    def __init__(self, line): 
        self.line = line
        self.xs = list(line.get_xdata())
        self.ys = list(line.get_ydata()) 
        self.cid = line.figure.canvas.mpl_connect('button_press_event', self) 
    def __call__(self, event):
        print 'click', event
        if event.inaxes!=self.line.axes: return 
        self.xs.append(event.xdata)
        self.ys.append(event.ydata) 
        self.line.set_data(self.xs, self.ys) 
        self.line.figure.canvas.draw()
        #If x.data < previous, plt.close ('all')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click to build line segments')
line, = ax.plot([0], [0])
linebuilder = LineBuilder(line)
plt.show ()
#Code that follows does not run in newer (?) version
暂无标签

1 个回答

0

Matplotlib有两种模式:一种是互动模式,另一种是非互动模式。我发现,根据你的系统配置,甚至是你启动脚本的方式(比如用系统命令行、互动命令行、专用命令行或者IDLE命令行等),这两种模式可能会有所不同。

如果你在代码的开头调用了 matplotlib.interactive(True),最好避免这样做。我在使用Matplotlib 0.99和1.3.1时,分别在python 2.65和2.75上试过,这样是有效的。另外,plt.ion() 也应该可以切换模式,不过我还没有测试过。

撰写回答