Présenté le donnée d'une base sqlite dans un graphique avec python

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

J'ai une base de donnée sqlite qui contient des données et je veux présenté le nombre d'enregistrement dans un graphique avec matptolib.
Ce que je souhaite c'est quelque chose du genre:



Voici mon code:

import sqlite3
import matplotlib.pyplot as plt

connection=sqlite3.connect("basedonnee.db")
curseur=connection.cursor()
curseur.execute("create table if not exists faute(id integer,matricule string(25))")
curseur.execute("insert into faute(id,matricule) values(1,'Jean')")
curseur.execute("insert into faute(id,matricule) values(1,'Jean')")
curseur.execute("insert into faute(id,matricule) values(1,'Jean')")
curseur.execute("insert into faute(id,matricule) values(1,'Jean')")
curseur.execute("insert into faute(id,matricule) values(1,'Jean')")

curseur.execute("insert into faute(id,matricule) values(2,'Marc')")
curseur.execute("insert into faute(id,matricule) values(2,'Marc')")
curseur.execute("insert into faute(id,matricule) values(2,'Marc')")
curseur.execute("insert into faute(id,matricule) values(2,'Marc')")
curseur.execute("insert into faute(id,matricule) values(2,'Marc')")
curseur.execute("insert into faute(id,matricule) values(2,'Marc')")
curseur.execute("insert into faute(id,matricule) values(2,'Marc')")

curseur.execute("insert into faute(id,matricule) values(3,'Luc')")
curseur.execute("insert into faute(id,matricule) values(3,'Luc')")
curseur.execute("insert into faute(id,matricule) values(3,'Luc')")
curseur.execute("insert into faute(id,matricule) values(3,'Luc')")


curseur.execute("insert into faute(id,matricule) values(4,'Joe')")
curseur.execute("insert into faute(id,matricule) values(4,'Joe')")
curseur.execute("insert into faute(id,matricule) values(4,'Joe')")


curseur.execute("select * from faute")
print(curseur.fetchall())
connection.commit()
connection.close()



J'ai essayé avec ce code mais je ne sais pas comment le combiner pour que le code pour qu'il soit mise à jour dynamiquement:

import matplotlib.pyplot as plt
labels = ['Jean', 'Marc', 'Luc', 'Joe']
quantity = [5,7,4,3]
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
plt.pie(quantity, labels=labels, colors=colors, autopct='%1.1f%%',
        shadow=True, startangle=100)
plt.axis('equal')
plt.show()


J'aimerais solliciter votre aide si vous pouvez m'aider comment combiner ces deux codes ou si vous avez d'autre suggestion. J'espère que vous avez compris mon problème, merci de votre collaboration.




Configuration: Windows / Firefox 72.0

2 réponses

Bonjour,

Je trouve bizarre d'insérer les mêmes lignes x fois dans ta table, alors que pour faire ça, tu devrais avoir 2 tables.

En outrepassant cette mauvaise architecture de ta base, il suffit simplement de compter le nombre de lignes pour chaque matricule (ou id).

import sqlite3
import matplotlib.pyplot as plt

labels = []
quantity = []

with sqlite3.connect("basedonnee.db") as con:
    cur = con.cursor()
    cur.execute("select matricule, count(*) from faute group by(id)")
    for matricule, nb in cur.fetchall():
        labels.append(matricule)
        quantity.append(nb)

colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
plt.pie(quantity, labels=labels, colors=colors, autopct='%1.1f%%',
        shadow=True, startangle=100)
plt.axis('equal')
plt.show()


Un autre problème se posera, si la taille de colors n'est pas au moins égal à la taille de labels, il y aura doublons de couleur.
1
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 9
14 févr. 2020 à 10:09
Merci ça marche très bien c'est très efficace votre aide, j'ai juste une dernière question si vous le permettez! j'aimerais que le graphique est sous forme d'une progressbar car le problème si l'utilisateur devient très nombreux alors le cercle devient très étroite. J'aimerais donc que l'image se présente comme ci-dessous si c'est possible:


Je me suis documenté un peu est cela m'oriente vers une autre bibliothèque comme plotnine!
voici le code que j'ai trouvé sur un certain site:

https://blog.algorexhealth.com/2018/03/almost-10-pie-charts-in-10-python-libraries/

from plotnine import * 

sources_plot = ggplot(source_data, aes(x='Source', y='FoodCode', fill='Source')) + geom_col() + coord_flip()\
+ scale_fill_brewer(type='div', palette="Spectral") + theme_classic() + ggtitle('Sources of Pie')


flavors_plot = ggplot(flavor_data, aes(x='FoodCode', y='Source', fill='FoodCode')) + geom_col() + coord_flip()\
+ scale_fill_brewer(type='div', palette="Spectral") + theme_classic() + ggtitle('Flavors of Pie')


display(sources_plot, flavors_plot)


J'aimerais avoir si matplotlib n'est pas capable de faire ce schéma pour ne pas compliqué le chose sinon comment procéder. Encore merci !
1
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 9 > rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021
Modifié le 14 févr. 2020 à 13:55
En fait après quelque recherche j'ai fini par trouvé comment procéder mais le résultat semble éroné, peut-être que mon code contient une erreur pouvez vous m'aider à rectifier s'il vous plaît merci:

import sqlite3
import matplotlib.pyplot as plt

var_matricule = []
var_nombre_faute = []

with sqlite3.connect("assembly.db") as con:
    cur = con.cursor()
    cur.execute("select matricule, count(*) from matable group by(matricule)")
    for matricule, nb in cur.fetchall():
        var_matricule.append(matricule)
        var_nombre_faute.append(nb)

# plt.pie(var_nombre_faute, labels=var_matricule, autopct='%1.1f%%',shadow=True, startangle=100)
# plt.axis('equal')
# plt.show()

y = [-4,0,4,8,12]
heigh = [22, 14, 18,9,5]
width=1
labels = var_matricule
colors = ['red']
plt.barh(y, heigh, width, align='center', color=colors)
plt.title("Statistique des fautes par matricule")
plt.yticks(y, labels)
# plt.xlabel('Statistique des fautes par matricule')
plt.axis('equal')
plt.show()


Je crois qu'il manque le plt.pie mais je ne sais pas comment fait-on pour avoir l'équivalence avec ce nouveau graphe plt.barh.
0
trifou > rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021
15 févr. 2020 à 08:37
Bonjour,

Je pense que c'est simplement les graduations de l’abscisse qui ne sont pas bonnes, mais ne connaissant pas matplotlib du tout, je ne sais comment cela se fait, il faudrait regarder dans les exemples exposés dans la doc matplotlib.
0
trifou > rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021
15 févr. 2020 à 13:18
En survolant rapidement ce qui est montré sur cette page
https://matplotlib.org/tutorials/introductory/lifecycle.html#sphx-glr-tutorials-introductory-lifecycle-py

Alors il est simple d'adapter à ton code

import sqlite3
import matplotlib.pyplot as plt
data = {}
with sqlite3.connect("assembly.db") as con:
    cur = con.cursor()
    cur.execute("select matricule, count(*) from matable group by(matricule)")
    data = cur.fetchall()

group_names = tuple(v[0] for v in data)
group_data = tuple(v[1] for v in data)

fig, ax = plt.subplots()
ax.barh(group_names, group_data, color='lightBlue', edgecolor='blue', height=0.5)

plt.show()


Mais ce n'est peut-être pas ce que tu souhaites obtenir.
0
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 9
17 févr. 2020 à 07:27
C'est exactement ce que je voulais! merci ça marche très bien! je suis très content du résultat! encore merci! ;-)
1