【问题标题】:Update an embedded matplotlib plot in a pyqt5 gui with toolbar使用工具栏更新 pyqt5 gui 中的嵌入式 matplotlib 图
【发布时间】:2019-04-14 22:30:24
【问题描述】:

post 中,我询问了如何在 pyqt5 gui 中嵌入 matplotlib 绘图,现在它工作正常。现在我还有一个直到现在还无法解决的问题:如何更新图形?

我尝试通过调用来更新画布

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_())

【问题讨论】:

    标签: python matplotlib pyqt5


    【解决方案1】:

    您不应该创建新图形,而是重用已有的坐标轴。这意味着您必须首先保留对该对象的引用。

    我现在无法测试代码,但你应该做类似的事情

    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
    

    【讨论】:

    • 谢谢!这很容易...... :)
    猜你喜欢
    • 2018-11-03
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2023-03-21
    • 2018-06-24
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多