2010-10-19 5 views
11

Je suis en train de concevoir une interface graphique avec PyQt où j'ai besoin d'afficher une fenêtre matplotlib/pylab lorsque je clique sur un bouton qui fait l'intrigue des données d'une fonction que j'ai créée. C'est comme une exécution utilisée dans Matlab. Je veux garder la fenêtre matplotlib/pylab comme fenêtre chaque fois que j'appuie sur ce bouton.Comment tracer sur mon interface graphique

Répondre

17

Voici un exemple de base qui va tracer trois échantillons différents en utilisant un QThread:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import random 

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg 
from matplotlib.figure import Figure 

from PyQt4 import QtGui, QtCore 

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

     self.figure = Figure() 
     self.canvas = FigureCanvasQTAgg(self.figure) 

     self.axis = self.figure.add_subplot(111) 

     self.layoutVertical = QtGui.QVBoxLayout(self) 
     self.layoutVertical.addWidget(self.canvas) 

class ThreadSample(QtCore.QThread): 
    newSample = QtCore.pyqtSignal(list) 

    def __init__(self, parent=None): 
     super(ThreadSample, self).__init__(parent) 

    def run(self): 
     randomSample = random.sample(range(0, 10), 10) 

     self.newSample.emit(randomSample) 

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

     self.pushButtonPlot = QtGui.QPushButton(self) 
     self.pushButtonPlot.setText("Plot") 
     self.pushButtonPlot.clicked.connect(self.on_pushButtonPlot_clicked) 

     self.matplotlibWidget = MatplotlibWidget(self) 

     self.layoutVertical = QtGui.QVBoxLayout(self) 
     self.layoutVertical.addWidget(self.pushButtonPlot) 
     self.layoutVertical.addWidget(self.matplotlibWidget) 

     self.threadSample = ThreadSample(self) 
     self.threadSample.newSample.connect(self.on_threadSample_newSample) 
     self.threadSample.finished.connect(self.on_threadSample_finished) 

    @QtCore.pyqtSlot() 
    def on_pushButtonPlot_clicked(self): 
     self.samples = 0 
     self.matplotlibWidget.axis.clear() 
     self.threadSample.start() 

    @QtCore.pyqtSlot(list) 
    def on_threadSample_newSample(self, sample): 
     self.matplotlibWidget.axis.plot(sample) 
     self.matplotlibWidget.canvas.draw() 

    @QtCore.pyqtSlot() 
    def on_threadSample_finished(self): 
     self.samples += 1 
     if self.samples <= 2: 
      self.threadSample.start() 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.resize(666, 333) 
    main.show() 

    sys.exit(app.exec_()) 

image

+0

Vous générez les données pour tracer l'intérieur de votre classe (avec le générateur aléatoire). Est-il possible de transmettre les données de l'extérieur. Quelque chose comme ça: 'main = MyWindow (data)' – jonie83

2

Si je vous comprends bien vous avez une application avec une interface graphique et que vous voulez tracer un graphique dans une fenêtre séparée que l'interface graphique utilise. pyqtgraph peut le faire bien.

premier type pip install pyqtgraph dans l'invite de commande pour installer pyqtgraph

puis

import pyqtgraph as pg 

    pg.setConfigOption('background', 'w')  # sets background to white             
    pg.setConfigOption('foreground', 'k')  # sets axis color to black 

    pw = pg.plot(x, y, pen='g')    # 1st plot (green)           
    pw.plot(x2, y2, pen='b')     # 2nd plot in same figure (blue) 

    pw.setLabel('bottom', 'x-label')   # x-label 
    pw.setLabel('left', 'y-label')    # y-label 

plus d'info ici: http://www.pyqtgraph.org/documentation/how_to_use.html

2

Ceci est du code de user1006989 (meilleure réponse) adaptée à PyQt5 , espérons qu'il sera utile à quelqu'un:

Voici un exemple de base qui tracera trois échantillons différents en utilisant un QThread:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import random 

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg 
from matplotlib.figure import Figure 

from PyQt5 import QtCore #conda install pyqt 
from PyQt5 import QtWidgets 

class MatplotlibWidget(QtWidgets.QWidget): 
    def __init__(self, parent=None): 
     super(MatplotlibWidget, self).__init__(parent) 

     self.figure = Figure() 
     self.canvas = FigureCanvasQTAgg(self.figure) 

     self.axis = self.figure.add_subplot(111) 

     self.layoutVertical = QtWidgets.QVBoxLayout(self)#QVBoxLayout 
     self.layoutVertical.addWidget(self.canvas) 

class ThreadSample(QtCore.QThread): 
    newSample = QtCore.pyqtSignal(list) 

    def __init__(self, parent=None): 
     super(ThreadSample, self).__init__(parent) 

    def run(self): 
     randomSample = random.sample(range(0, 10), 10) 

     self.newSample.emit(randomSample) 

class MyWindow(QtWidgets.QWidget): 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     self.pushButtonPlot = QtWidgets.QPushButton(self) 
     self.pushButtonPlot.setText("Plot") 
     self.pushButtonPlot.clicked.connect(self.on_pushButtonPlot_clicked) 

     self.matplotlibWidget = MatplotlibWidget(self) 

     self.layoutVertical = QtWidgets.QVBoxLayout(self) 
     self.layoutVertical.addWidget(self.pushButtonPlot) 
     self.layoutVertical.addWidget(self.matplotlibWidget) 

     self.threadSample = ThreadSample(self) 
     self.threadSample.newSample.connect(self.on_threadSample_newSample) 
     self.threadSample.finished.connect(self.on_threadSample_finished) 

    @QtCore.pyqtSlot() 
    def on_pushButtonPlot_clicked(self): 
     self.samples = 0 
     self.matplotlibWidget.axis.clear() 
     self.threadSample.start() 

    @QtCore.pyqtSlot(list) 
    def on_threadSample_newSample(self, sample): 
     self.matplotlibWidget.axis.plot(sample) 
     self.matplotlibWidget.canvas.draw() 

    @QtCore.pyqtSlot() 
    def on_threadSample_finished(self): 
     self.samples += 1 
     if self.samples <= 2: 
      self.threadSample.start() 

if __name__ == "__main__": 
    import sys 

    app = QtWidgets.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.resize(666, 333) 
    main.show() 

    sys.exit(app.exec_()) 
Questions connexes