Обновите встроенный график matplotlib в графическом интерфейсе pyqt5 с помощью панели инструментов - PullRequest
0 голосов
/ 12 ноября 2018

В этом посте я спросил, как встроить график matplotlib в графический интерфейс pyqt5, который сейчас работает нормально. Теперь у меня есть еще одна проблема, которую я не мог решить до сих пор: как я могу обновить фигуру?

Я попытался обновить холст, вызвав

self.plotWidget = FigureCanvas(fig)

каждый раз с новым "фиговым" объектом, но ничего не происходило. Поэтому я попытался добавить его в макет

self.lay.addWidget(self.plotWidget)

но это добавляет еще один субплот к виджету. Я предполагаю, что мне нужно очистить предыдущий график перед обновлением, но я не знаю, как это сделать.

Какова правильная стратегия для реплота с использованием метода обновления?

Спасибо!

# -*- coding: utf-8 -*-

import sys
import numpy as np   

from PyQt5 import QtCore, QtWidgets, uic

import matplotlib
matplotlib.use('QT5Agg')

import matplotlib.pylab as plt

from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
from matplotlib.backends.backend_qt5agg import FigureCanvas, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure

class MyWindow(QMainWindow):

    def __init__(self):

        super(MyWindow, self).__init__()
        uic.loadUi('test.ui', self) 

        # test data
        data = np.array([0.7,0.7,0.7,0.8,0.9,0.9,1.5,1.5,1.5,1.5])        
        fig, ax1 = plt.subplots()
        bins = np.arange(0.6, 1.62, 0.02)
        n1, bins1, patches1 = ax1.hist(data, bins, alpha=0.6, density=False, cumulative=False)

        # plot
        self.plotWidget = FigureCanvas(fig)
        self.lay = QtWidgets.QVBoxLayout(self.content_plot)  
        self.lay.setContentsMargins(0, 0, 0, 0)      
        self.lay.addWidget(self.plotWidget)

        # add toolbar
        self.addToolBar(QtCore.Qt.BottomToolBarArea, NavigationToolbar(self.plotWidget, self))        

        # button event
        self.pushButton.clicked.connect(self.update)

        # show window
        self.show() 

        #########################################

    def update(self):

        data = np.array([0.1,0.1,0.1,0.1,0.3,0.3,1.7,1.7,1.7,1.7])        
        fig, ax1 = plt.subplots()
        bins = np.arange(0.6, 1.62, 0.02)
        n1, bins1, patches1 = ax1.hist(data, bins, alpha=0.6, density=False, cumulative=False)

        # show plot in canvas  
        self.plotWidget = FigureCanvas(fig)
        self.toolbarWidget = NavigationToolbar(self.plotWidget, self)        


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 12 ноября 2018

Не следует создавать новую фигуру, вместо этого повторно используйте оси, которые у вас уже есть.Это означает, что вы должны сначала сохранить ссылку на этот объект.

Я не могу проверить код прямо сейчас, но вы должны сделать что-то вроде

def __init__(self):
    (...)
    self.fig, self.ax = plt.subplots()
    (...)

def update(self):
    data = (...)
    self.ax.cla()  # clear the axes content
    self.ax.hist(...)
    self.fig.canvas.draw_idle()  # actually draw the new content
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...