python - figurecanvas - Cómo incrustar matplotlib en pyqt-para Dummies
matplotlib pyqt5 (2)
A continuación se muestra una adaptación del código anterior para usar bajo PyQt5 y Matplotlib 2.0 . Hay una serie de pequeños cambios: estructura de los submódulos PyQt, otro submódulo de matplotlib, método obsoleto ha sido reemplazado ...
import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
import random
class Window(QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
# a figure instance to plot on
self.figure = plt.figure()
# this is the Canvas Widget that displays the `figure`
# it takes the `figure` instance as a parameter to __init__
self.canvas = FigureCanvas(self.figure)
# this is the Navigation widget
# it takes the Canvas widget and a parent
self.toolbar = NavigationToolbar(self.canvas, self)
# Just some button connected to `plot` method
self.button = QPushButton(''Plot'')
self.button.clicked.connect(self.plot)
# set the layout
layout = QVBoxLayout()
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
layout.addWidget(self.button)
self.setLayout(layout)
def plot(self):
'''''' plot some random stuff ''''''
# random data
data = [random.random() for i in range(10)]
# instead of ax.hold(False)
self.figure.clear()
# create an axis
ax = self.figure.add_subplot(111)
# discards the old graph
# ax.hold(False) # deprecated, see above
# plot data
ax.plot(data, ''*-'')
# refresh canvas
self.canvas.draw()
if __name__ == ''__main__'':
app = QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())
Actualmente estoy intentando insertar un gráfico que quiero trazar en una interfaz de usuario pyqt4 que diseñé. Como soy casi completamente nuevo en la programación, no entiendo cómo se incrustó la gente en los ejemplos que encontré, este (en la parte inferior) y ese .
Sería increíble si alguien pudiera publicar una explicación paso a paso o al menos un código muy pequeño y muy simple que solo crea, por ejemplo, un gráfico y un botón en una GUI de pyqt4.
No es tan complicado en realidad. Los widgets de Qt relevantes están en matplotlib.backends.backend_qt4agg
. FigureCanvasQTAgg
y NavigationToolbar2QT
suelen ser lo que necesitas. Estos son widgets regulares de Qt. Tú los tratas como cualquier otro artilugio. A continuación se muestra un ejemplo muy simple con una Figure
, Navigation
y un solo botón que dibuja algunos datos aleatorios. He agregado comentarios para explicar las cosas.
import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import random
class Window(QtGui.QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
# a figure instance to plot on
self.figure = Figure()
# this is the Canvas Widget that displays the `figure`
# it takes the `figure` instance as a parameter to __init__
self.canvas = FigureCanvas(self.figure)
# this is the Navigation widget
# it takes the Canvas widget and a parent
self.toolbar = NavigationToolbar(self.canvas, self)
# Just some button connected to `plot` method
self.button = QtGui.QPushButton(''Plot'')
self.button.clicked.connect(self.plot)
# set the layout
layout = QtGui.QVBoxLayout()
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
layout.addWidget(self.button)
self.setLayout(layout)
def plot(self):
'''''' plot some random stuff ''''''
# random data
data = [random.random() for i in range(10)]
# create an axis
ax = self.figure.add_subplot(111)
# discards the old graph
ax.clear()
# plot data
ax.plot(data, ''*-'')
# refresh canvas
self.canvas.draw()
if __name__ == ''__main__'':
app = QtGui.QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())
Editar :
Actualizado para reflejar comentarios y cambios de API.
-
NavigationToolbar2QTAgg
cambiado conNavigationToolbar2QT
-
pyplot
directamenteFigure
lugar depyplot
- Reemplace
ax.hold(False)
obsoletoax.hold(False)
conax.clear()