У меня есть временная история изображений (2 + 1) D массивов, которые я беру с различными кусочками и проверяю, используя ipython
, и каждое представление представляет собой фигуру matplotlib.
У меня есть собственный класс, который использует виджеты matplotlib (в частности, Slider), чтобы позволить интерактивному окну открывать и просматривать изображения кадр за кадром, как выбранный Slider. Виджет работает нормально, но для блокировки использует команду plt.show()
, что тоже хорошо, пока я не закончу с виджетом.
Чтобы передать управление обратно в командную строку i python, мне нужно закрыть все рисунки matplotlib - я хотел бы иметь возможность только закрыть окно, связанное с виджетом. Есть ли какой-нибудь метод для включения этой функции?
Что-то вроде fig.show(blocking=True)
было бы тем, что я представляю себе, то есть, ограничивало блокировку GUI mainl oop только поиском plt.close () этого окна , но, похоже, в настоящее время это не реализовано.
@ ImportanceOfBeingEarnest, спасибо за ответ. Я добавил код, который я использую для виджета просмотра. Для инициализации объекта вам просто нужно предоставить трехмерный массив значений [frames (t), y, x]. т.е.
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()