Ajouté matplotlib dans un canvas

Résolu/Fermé
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 - 17 févr. 2020 à 12:01
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 - 19 févr. 2020 à 06:48
Bonjour,

J'ai un code qui permet d'afficher le nombre d'enregistrement des personnage dans un graphe avec matplotlib:

import sqlite3
import matplotlib.pyplot as plt
import numpy as np

var_personnage = []
var_nombre_faute = []

with sqlite3.connect("base.db") as con:
    cur = con.cursor()
    cur.execute("create table if not exists matable(id integer,type string(25),personne integer)")
    cur.execute("insert into matable(id,type,personne) values(1,'Jean',1000)")
    cur.execute("insert into matable(id,type,personne) values(1,'Jean',1000)")
    cur.execute("insert into matable(id,type,personne) values(1,'Jean',1000)")
    cur.execute("insert into matable(id,type,personne) values(2,'Jacques',2000)")
    cur.execute("insert into matable(id,type,personne) values(2,'Jacques',2000)")
    cur.execute("insert into matable(id,type,personne) values(3,'Julien',3000)")
    cur.execute("insert into matable(id,type,personne) values(4,'Julien',4000)")
    cur.execute("select personne, count(*) from matable group by(personne)")
    for personne, nb in cur.fetchall():
        var_personnage.append(personne)
        var_nombre_faute.append(nb)

fig, ax = plt.subplots()
people = var_personnage
y = np.arange(len(people))
error=0
ax.barh(y, var_nombre_faute, xerr=error, align='center',color='red', edgecolor='green', height=0.5)
ax.set_yticks(y)
ax.set_yticklabels(people)
ax.invert_yaxis()  # labels read top-to-bottom
ax.set_xlabel('Pourcentage')
ax.set_title('Nombre enregistrement personne')
plt.show()



Et j'aimerais intégrer ce code dans ma fenetre personnel à l'aide d'un canevas:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
import sqlite3
import matplotlib.pyplot as plt
import matplotlib
from matplotlib import figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import numpy as np


class MatplotlibFigure(QWidget):

    # constructor
    def __init__(self):
        super().__init__()
        #self.layout = QBoxLayout()
        self.figure = matplotlib.figure.Figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        #self.layout.addWidget(self.canvas)
        super().__init__()
        # self.layout = QBoxLayout()
        self.figure = matplotlib.figure.Figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)

        layout = QVBoxLayout(self)
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)



class Fenetre(QMainWindow):
    def __init__(self):
        super(Fenetre, self).__init__()
        self.setWindowTitle("Mon fenetre")
        self.resize(500,300)
        self.figure = matplotlib.figure.Figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        centraWidget=QWidget()
        layout=QVBoxLayout()

        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)

        centraWidget.setLayout(layout)
        self.setCentralWidget(centraWidget)


app=QApplication.instance()
if not app:
    app=QApplication(sys.argv)
fenetre=Fenetre()
fenetre.show()
app.exec_()


Ce que je veux c'est fusionner ce deux codes pouvez vous m'aider s'il vous plaît je suis un peu perdu!

Cordialement!

2 réponses

Bonsoir,

Tu pourrais t'aider de cette page :
https://pythonspot.com/pyqt5-matplotlib/

Et il y a beaucoup d'autres articles concernant pyqt5 sur ce site.

J'ai rapidement testé à partir du code cette page en intégrant le graphique et réduisant le code au plus simple.

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure

class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'Title'
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.canvas = PlotCanvas(self)
        self.setGeometry(0, 0, self.canvas.width(), self.canvas.height())
        self.show()


class PlotCanvas(FigureCanvas):
    def __init__(self, parent):
        fig = Figure()
        self.axes = fig.subplots()
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
        self.toolbar = NavigationToolbar(self, self)
        height = self.toolbar.height() + self.height()
        fig.set_figheight(height)
        self.plot()

    def plot(self):
        import sqlite3
        var_personnage = []
        var_nombre_faute = []
        with sqlite3.connect("base.db") as con:
            cur = con.cursor()
            cur.execute("select personne, count(*) from matable group by(personne)")
            for personne, nb in cur.fetchall():
                var_personnage.append(personne)
                var_nombre_faute.append(nb)

        people = var_personnage
        y = range(len(people))
        error=0
        self.axes.barh(y, var_nombre_faute, xerr=error, align='center',color='red', edgecolor='green', height=0.5)
        self.axes.set_yticks(y)
        self.axes.set_yticklabels(people)
        self.axes.invert_yaxis()  # labels read top-to-bottom
        self.axes.set_xlabel('Pourcentage')
        self.axes.set_title('Nombre enregistrement personne')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())


Comme je suppose que le but est d'ajouter d'autres widgets à ta fenêtre sinon aucun intérêt en l'état, il faudra je pense utiliser des layouts, comme tu as tenté de faire.
1
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 9
19 févr. 2020 à 06:48
Impeccable comme d'hab! merci beaucoup ça marche très bien! :-)
1