pyqt5, matplotlib2 и устаревание осей.держать


На основе демонстрационного кода из https://gist.github.com/pklaus/3e16982d952969eb8a9a для встраивания графов matplotlib в графический интерфейс qt у меня есть следующий код:

# https://gist.github.com/pklaus/3e16982d952969eb8a9a
class MatplotlibCanvas(FigureCanvas):

    """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
    def __init__(self, mystacker, spectrum_id, parent=None, width=5, height=4, dpi=100):
        self.stacker = mystacker
        self.spectrum_id = spectrum_id

        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        # We want the axes cleared every time plot() is called
        self.axes.hold(False)

        self.compute_initial_figure()

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        spectrumplot.plot_spectrum(self.stacker, self.spectrum_id, self.axes)

Но с новой версией matplotlib 2, я получаю следующее предупреждение:

MatplotlibDeprecationWarning: axes.hold is deprecated. See the API Changes document (http://matplotlib.org/api/api_changes.html) for more details.

Http://matplotlib.org/api/api_changes.html говорит

Аргумент ключевого слова hold и все функции и методы, связанные с ним его не рекомендуется использовать вместе с Осей‘.держите вход rcParams. То поведение должно соответствовать умолчанию=истинное состояние, что уже давно на месте. Вместо использования функции или ключевого слова аргумент (hold=False) чтобы изменить это поведение, явно очистите оси или рисунок по мере необходимости перед последующими командами построения графика.

Каковы были бы правильные призывы "явно очистить оси или фигуру по мере необходимости" в моем случае?

1 4

1 ответ:

Из приведенного кода не ясно, в какой момент вам действительно понадобится hold(False).

В документации говорится, что вы должны очистить оси явно, Если вам это нужно, а не полагаться на какой-то автоматический зазор. То есть используйте self.axes.clear() в любой точке, которую вы хотите очистить от осей и удалить ее содержимое. Действительно ли вам нужно очистить оси, зависит от вашего случая использования. Обычно обновление художников в осях является гораздо более чистым способом, чем очистка осей и воссоздание работники искусства.

(Возможно, вы захотите обновить свой вопрос, чтобы включить дополнительную информацию о том, что именно вы делаете, чтобы кто-то знал, в какой момент вам это понадобится.)