Прокручиваемая фигура Matplotlib не работает из функции - PullRequest
0 голосов
/ 10 февраля 2020

Сейчас я работаю над медицинскими изображениями и пишу код для подготовки учебного набора. Для этого мне нужно прокрутить фрагменты данных тома.

Моя основная среда IDE - Spyder, но стандартная реализация объекта IndexTracker не работает для меня В функции.

Это стандартная реализация работает для меня: https://matplotlib.org/gallery/animation/image_slices_viewer.html

Но как только я поместил создание графика в функцию, созданный график больше не прокручивается:

import numpy as np
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt

class IndexTracker(object):
    def __init__(self, ax, X):
        self.ax = ax
        ax.set_title('use scroll wheel to navigate images')

        self.X = X
        rows, cols, self.slices = X.shape
        self.ind = self.slices//2

        self.im = ax.imshow(self.X[:, :, self.ind])
        self.update()

    def onscroll(self, event):
        print("%s %s" % (event.button, event.step))
        if event.button == 'up':
            self.ind = (self.ind + 1) % self.slices
        else:
            self.ind = (self.ind - 1) % self.slices
        self.update()

    def update(self):
        self.im.set_data(self.X[:, :, self.ind])
        self.ax.set_ylabel('slice %s' % self.ind)
        self.im.axes.figure.canvas.draw()

def plot(X):
    fig, ax = plt.subplots(1, 1)
    tracker = IndexTracker(ax, X)
    fig.canvas.mpl_connect('scroll_event', tracker.onscroll)
    plt.show()

plot(np.random.rand(200, 200, 500))

В чем может быть проблема? Как мне создать прокручиваемый график из функции?

1 Ответ

0 голосов
/ 12 февраля 2020

Я сам решил проблему: проблема в том, что matplotlib неправильно идентифицирует экземпляр графика, и поэтому он должен быть установлен в функции. Основным c и НЕ УНИВЕРСАЛЬНЫМ ИЛИ ПРАКТИЧЕСКИМ приложением будет следующее:

figList,axList=[],[]
def plotSlices(image, view):
    fig, ax = plt.subplots(1, 1)
    figList.append(fig)
    axList.append(ax)
    axList[-1].set_title(view)
    tracker = IndexTracker(axList[-1], image)
    figList[-1].canvas.mpl_connect('scroll_event', tracker.onscroll)
    plt.show(figList[-1],block=False)

, в котором массив numpy считывается вместе с перспективой изображения. Это используется только для заголовка, поэтому вы можете удалить его / жестко закодировать заголовок. Объекты fig и ax добавляются в соответствующие списки, из которых только что добавленные элементы отображаются в matplotlib для построения графика.

Таким образом, прокрутка графиков, определенных в функции, работает. Одна из проблем заключается в том, что я явно перегружаю метод .show (), который должен принимать только аргумент block = False / True, но на самом деле правильно идентифицирует правильный график следующим образом: plt.show (fig, block = False) выдает ошибку, обращаясь к этому, но в конечном итоге работает. Отлично!

...