PyQt4中嵌入matplotlib的问题
Problems on embedding matplotlib in PyQt4
代码如下:
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 中的Item 改变时刷新图形。但是现在,什么也没有发生。
我是Python的初学者,只是不知道如何解决这个问题。那么,如何将QComboBox与matplotlib生成的图形连接起来呢?
根据指令self.canvas_widget = MyCanvas(key=unicode(key_name))
,您正在创建一个没有父级的新小部件,因此不会显示,此外建议不要创建新小部件,因为它是不必要的内存开销,什么你必须为它重用小部件我编写了内部调用 compute_initial_figure 方法的 setKey 方法,该方法负责重新绘制重用散点图。
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))
代码如下:
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 中的Item 改变时刷新图形。但是现在,什么也没有发生。
我是Python的初学者,只是不知道如何解决这个问题。那么,如何将QComboBox与matplotlib生成的图形连接起来呢?
根据指令self.canvas_widget = MyCanvas(key=unicode(key_name))
,您正在创建一个没有父级的新小部件,因此不会显示,此外建议不要创建新小部件,因为它是不必要的内存开销,什么你必须为它重用小部件我编写了内部调用 compute_initial_figure 方法的 setKey 方法,该方法负责重新绘制重用散点图。
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))