【问题标题】:Problems on embedding matplotlib in PyQt4在 PyQt4 中嵌入 matplotlib 的问题
【发布时间】:2018-05-10 06:06:56
【问题描述】:

代码如下:

from matplotlib.backends.qt_compat import QtCore, QtGui
from matplotlib.backends.backend_qt4agg import (FigureCanvasQTAgg as FigureCanvas)
from matplotlib.figure import Figure
import sys

class MyCanvas(FigureCanvas):
    def __init__(self, parent=None, key="case 1"):

        self.case_dict = {"case 1": [2, 4, 6, 8, 10],
                        "case 2": [3, 4, 5, 6, 7]}

        self.key = key

        self.fig = Figure()
        self.axes = self.fig.add_subplot(111)

        self.compute_initial_figure()

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

        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        x = [1, 2, 3, 4, 5]
        y = self.case_dict[self.key]
        self.axes.set_title("%s" % self.key)
        self.axes.scatter(x, y)

class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.canvas_widget = MyCanvas()

        self.combo = QtGui.QComboBox()
        for key in MyCanvas().case_dict:
            self.combo.addItem(key)
            self.combo.setCurrentIndex(-1)

        self.combo.currentIndexChanged.connect(self.showPlot)

        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.canvas_widget)
        layout.addWidget(self.combo)

    def showPlot(self):
        key_name = self.combo.currentText()
        self.canvas_widget = MyCanvas(key=unicode(key_name))

qApp = QtGui.QApplication(sys.argv)

aw = MainWindow()
aw.show()
sys.exit(qApp.exec_())

我希望在 QComboBox 中的项目更改时刷新图形。但现在,什么都没有发生。

我是 Python 的初学者,只是不知道如何解决这个问题。那么,QComboBox和matplotlib生成的图形应该怎么连接呢?

【问题讨论】:

    标签: python python-2.7 matplotlib pyqt pyqt4


    【解决方案1】:

    使用指令self.canvas_widget = MyCanvas(key=unicode(key_name)) 您正在创建一个没有父级的新小部件,因此不会显示它,此外建议不要创建新小部件,因为它是不必要的内存开销,您必须重用我为它编写了 setKey 方法,该方法在内部调用了负责重绘重用散点图的 compute_initial_figure 方法。

    from matplotlib.backends.qt_compat import QtCore, QtGui
    from matplotlib.backends.backend_qt4agg import (FigureCanvasQTAgg as FigureCanvas)
    from matplotlib.figure import Figure
    import sys
    
    class MyCanvas(FigureCanvas):
        def __init__(self, parent=None, key="case 1"):
    
            self.case_dict = {"case 1": [2, 4, 6, 8, 10],
                            "case 2": [3, 4, 5, 6, 7]}
            self.key = key
            self.fig = Figure()
            self.axes = self.fig.add_subplot(111)
            FigureCanvas.__init__(self, self.fig)
            self.setParent(parent)
            FigureCanvas.updateGeometry(self)
    
            self.sc = None
            self.compute_initial_figure()
    
        def setKey(self, key):
            self.key = key
            self.compute_initial_figure()
    
        def compute_initial_figure(self):
            x = [1, 2, 3, 4, 5]
            y = self.case_dict[self.key]
            self.axes.set_title("%s" % self.key)
            if self.sc is None:
                self.sc = self.axes.scatter(x, y)
            else:
                import numpy as np
                data = np.stack((np.asarray(x), np.asarray(y)), axis=1)
                self.sc.set_offsets(data)
                self.draw()
    
    
    class MainWindow(QtGui.QWidget):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    
            self.canvas_widget = MyCanvas()
    
            self.combo = QtGui.QComboBox()
            for key in MyCanvas().case_dict:
                self.combo.addItem(key)
                self.combo.setCurrentIndex(-1)
    
            self.combo.currentIndexChanged.connect(self.showPlot)
    
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.canvas_widget)
            layout.addWidget(self.combo)
    
        def showPlot(self):
            key_name = self.combo.currentText()
            self.canvas_widget.setKey(unicode(key_name))
    

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多