matplotlib 的主循环的阻塞是否可以限制为单个 window/figure?--即 fig.show(blocking=True)
Can blocking of matplotlib's mainloop be limited to a single window/figure?--i.e., fig.show(blocking=True)
我有图像 (2 + 1)D 数组的时间历史记录,我使用 ipython
对其进行各种切片和检查,每个视图都是一个 matplotlib 图。
我有一个自定义 class,它使用 matplotlib 小部件(特别是滑块)允许交互式 window 打开并逐帧查看滑块选择的图像。该小部件工作正常,但使用 plt.show()
命令进行阻止,在我完成该小部件之前这也很好。
为了将控制传回 ipython 命令行,我必须关闭所有 matplotlib 图形——我希望只能关闭与小部件关联的 window .有什么方法可以启用此功能吗?
fig.show(blocking=True)
之类的东西是我想象中想要的,即将 GUI 主循环的阻塞限制为仅查找 window 的 plt.close(),但这似乎不是当前的已实施。
@ImportanceOfBeingEarnest,感谢您的回复。我添加了用于查看器小部件的代码。要初始化对象,您只需要提供 [frames (t), y, x] 值的 3D 数组。即
randomData = np.random.rand((5,5,5))
class showFrames(object):
def __init__(self, timeData):
self.data = timeData # 3D array of t, y, x values
self.fig, self.ax = plt.subplots(1)
self.im = None
self.frameStr = None
self.start()
def start(self):
# initialize GUI
Tmin = self.data.min()
Tmax = self.data.max()
frameInit = self.data.shape[0] - 1
self.im = self.ax.imshow(self.data[frameInit])
self.im.set_clim(Tmin, Tmax)
self.fig.colorbar(self.im)
self.frameStr = self.ax.text(0.1, 0.1, '', transform=self.ax.transAxes, color='white')
axis_color = 'yellow'
# Add frame and radius slider for tweaking the parameters
frame_slider_ax = self.fig.add_axes([0.25, 0.05, 0.65, 0.03], axisbg=axis_color)
frame_slider = Slider(frame_slider_ax, 'Frame', 0, frameInit, valinit=frameInit)
frame_slider.on_changed(self.frame_slider_on_changed)
plt.show()
def frame_slider_on_changed(self, i):
self.im.set_data(self.data[int(i)])
self.frameStr.set_text(str(int(i)))
self.fig.canvas.draw_idle()
您的 Slider
实例正在被垃圾回收,因为您没有保留对它的引用。
For the slider to remain responsive you must maintain a reference to it.
在这种情况下 self.slider=Slider(...)
而不是 slider=Slider(...)
。
我有图像 (2 + 1)D 数组的时间历史记录,我使用 ipython
对其进行各种切片和检查,每个视图都是一个 matplotlib 图。
我有一个自定义 class,它使用 matplotlib 小部件(特别是滑块)允许交互式 window 打开并逐帧查看滑块选择的图像。该小部件工作正常,但使用 plt.show()
命令进行阻止,在我完成该小部件之前这也很好。
为了将控制传回 ipython 命令行,我必须关闭所有 matplotlib 图形——我希望只能关闭与小部件关联的 window .有什么方法可以启用此功能吗?
fig.show(blocking=True)
之类的东西是我想象中想要的,即将 GUI 主循环的阻塞限制为仅查找 window 的 plt.close(),但这似乎不是当前的已实施。
@ImportanceOfBeingEarnest,感谢您的回复。我添加了用于查看器小部件的代码。要初始化对象,您只需要提供 [frames (t), y, x] 值的 3D 数组。即
randomData = np.random.rand((5,5,5))
class showFrames(object):
def __init__(self, timeData):
self.data = timeData # 3D array of t, y, x values
self.fig, self.ax = plt.subplots(1)
self.im = None
self.frameStr = None
self.start()
def start(self):
# initialize GUI
Tmin = self.data.min()
Tmax = self.data.max()
frameInit = self.data.shape[0] - 1
self.im = self.ax.imshow(self.data[frameInit])
self.im.set_clim(Tmin, Tmax)
self.fig.colorbar(self.im)
self.frameStr = self.ax.text(0.1, 0.1, '', transform=self.ax.transAxes, color='white')
axis_color = 'yellow'
# Add frame and radius slider for tweaking the parameters
frame_slider_ax = self.fig.add_axes([0.25, 0.05, 0.65, 0.03], axisbg=axis_color)
frame_slider = Slider(frame_slider_ax, 'Frame', 0, frameInit, valinit=frameInit)
frame_slider.on_changed(self.frame_slider_on_changed)
plt.show()
def frame_slider_on_changed(self, i):
self.im.set_data(self.data[int(i)])
self.frameStr.set_text(str(int(i)))
self.fig.canvas.draw_idle()
您的 Slider
实例正在被垃圾回收,因为您没有保留对它的引用。
For the slider to remain responsive you must maintain a reference to it.
在这种情况下 self.slider=Slider(...)
而不是 slider=Slider(...)
。