IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de mise en forme d'un histogramme [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut Problème de mise en forme d'un histogramme
    Bonjour

    Je viens vers vous car j'ai trois soucis sur la mise en format de mon histogramme :
    • les barres ne sont pas centrées autour des valeurs pourtant je croyais que l'ajout de le permettait
    • si une valeur n'est pas dans ma liste de départ, elle n'apparaît pas comme étiquette sur l'axe des x
    • mes données peuvent être des valeurs inférieures à 1 (typiquement varié de 0.01 à 0.02 tous les 0.001) mais quand je veux l'intégrer à je reçois un message d'erreur 'float' object cannot be interpreted as an integer, que je comprends bien mais dont je ne sais pas comment faire pour le résoudre.


    Mon exemple de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    import numpy as np
    import matplotlib.pyplot as plt
    import statistics
    tau = np.array([1, 2, 2, 4, 4, 4, 4, 4, 5, 5])
     
    n, bins, patches = plt.hist(tau, bins='auto', color='#0504aa',\
                                alpha=0.75, align="mid", rwidth=0.5, edgecolor="black")
     
    # Calcul statistique sur la liste
    moyenne=np.mean(tau)
    ecarttype=np.std(tau, ddof=1)  #ddof=1 permet l'ecart type statistique (et non
                                #mathématique) en divisant par (n-1) au lieu de (n)
    incertitude=ecarttype/sqrt(len(tau))
    maxfreq = n.max()
     
    xmin ,xmax = tau.min(), tau.max()
    ymax=np.ceil(maxfreq/5) *5 if maxfreq % 5 else maxfreq + 5
    dx = (xmax - xmin)*0.1
    plt.xlim(xmin - dx, xmax + dx)
    plt.ylim(ymax=np.ceil(maxfreq/5) *5 if maxfreq % 5 else maxfreq + 5)
    plt.xticks(range(tau.min(), tau.max(), 1))
     
    plt.xlabel(r"Valeur de $\tau$")
    plt.ylabel("Fréquence")
     
    plt.text(moyenne,0.9*ymax,r"$\overline{{\tau}} = {:.3e} s $".format(moyenne))
    plt.text(moyenne,0.85*ymax,r"$u({{\tau}}) = {:.4e} s $".format(incertitude))
    plt.title(r"Répartition des valeurs de $\tau$ mesurées")
    plt.xticks(tau)
    plt.savefig("charge_condensateur_mesuretau.png")
    plt.show()
    Merci d'avance pour l'aide
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Bonjour

    Vous mélangez pas mal de choses ... et le rwidth vous empeche de voir correctement ce qu'il se passe.
    Quand vous spécifier bins="auto", vous n'avez aucune garantie que si vos données prennent seulement 5 valeurs (1,2,3,4 et 5), alors bins = 5.

    Si vous entrez ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    n, bins, patches = plt.hist(tau, bins=5, color='#0504aa',
                                alpha=0.75, 
                                range=(0.5,5.5),
                                edgecolor="black")
    alors à priori ca ce passe comme vous voulez. Si vous mettez bins="auto" vous voyez que votre abscisse est découpé en 6 barres et non pas en 5...

    Et après pour l'histoire du 0.01, 0.02, etc ... et bien la fonction hist considère vos données dans un intervalle continue, et elle s'autorise à sectionner cet intervalle comme bon lui semble. Donc si dans vos données tau, on met des valeurs comme ca en plus, alors on va juste avoir une barre en plus qui va regrouper toute les petites valeurs. Car oui c'est le principe d'un histogramme.

    Vous ce que vous voulez ce n'est pas vraiment un histogramme j'ai l'impression. Vous voulez plutot que chaque valeur ait à la fois son label et qu'on sache en combien d'exemplaire est présent cette valeur. Donc c'est plutôt un Count que vous chercher à représenter je pense. Cette discussion pourra vous aider (même si c'est en anglais, le code est universel) :
    https://stackoverflow.com/questions/...uild-histogram

  3. #3
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut
    Bonsoir,

    Merci pour ton retour et ton aide.

    Citation Envoyé par lg_53 Voir le message
    Vous ce que vous voulez ce n'est pas vraiment un histogramme j'ai l'impression. Vous voulez plutot que chaque valeur ait à la fois son label et qu'on sache en combien d'exemplaire est présent cette valeur. Donc c'est plutôt un Count que vous chercher à représenter je pense.
    Effectivement, en regardant la différence entre un histogramme et un diagramme en bars, c'est bien ce dernier dont j'ai besoin : mes valeurs étant discrètes et donc non continues.

    J'ai donc mis en oeuvre la solution proposée dans le lien fourni mais il subsiste un petit problème de tri : j'obtiens bien le diagramme en bars avec un formatage correct, le seul hic, c'est que les "labels" (dans mon cas les valeurs mesurées de tau) ne sont pas dans l'ordre numérique.
    J'ai pensé convertir le tuple (issu de l'utilisation du compteur) en liste sauf que cela ne conserve pas le couple (valeur, fréquence) puisque j'obtiens deux listes indépendantes.

    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    tau = np.loadtxt("constantetemps.txt", delimiter=";",unpack=True)
     
    labels, valeurs = zip(*Counter(tau).items())
    donnees = list(labels)
    frequence = list(valeurs)
    print(donnees)
    #donnees.sort()
    index = np.arange(len(labels))
    index2 = np.arange(len(donnees))
    width = 0.35
    rects1 = plt.bar(index, valeurs, width, align="edge")
    rects2 = plt.bar(index2, frequence, width, align="edge")
     
    maxfreq = max(valeurs)
    maxfreq2 = max(frequence)
    minfreq = min(valeurs)
    minfreq2 = min(frequence)
    xmin ,xmax = tau.min(), tau.max()
    dx = (xmax - xmin)*0.1
     
    plt.xlabel(r"Valeur de $\tau (s)$")
    plt.ylabel("Fréquence")
     
    #plt.xticks(index + width * 0.5, labels)
    plt.xticks(index2 + width * 0.5, donnees)
     
    plt.show()
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Il faut nous mettre un exemple que l'on peut reproduire. Là on n'a pas ton fichier, donc on ne peut pas faire tourner ton code.

    Définissez un tau à la main comme dans votre premier post, qui reproduit le problème.

    Après je pense qu'en triant les données ça doit être bon. Au lieu d'essayer de trier juste une partie des données, vous avez essayez en faisant directement le tri sur list(Counter(tau).items()) ?

  5. #5
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut
    Bonjour

    Citation Envoyé par lg_53 Voir le message
    Il faut nous mettre un exemple que l'on peut reproduire. Là on n'a pas ton fichier, donc on ne peut pas faire tourner ton code.

    Définissez un tau à la main comme dans votre premier post, qui reproduit le problème.
    Avec ces données, j'ai mon souci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tau = np.array([0.1, 0.2, 0.5, 0.4, 0.1 , 0.3, 0.3, 0.2, 0.1])
    Citation Envoyé par lg_53 Voir le message
    Après je pense qu'en triant les données ça doit être bon. Au lieu d'essayer de trier juste une partie des données, vous avez essayez en faisant directement le tri sur list(Counter(tau).items()) ?
    Pour la méthode de création de listes directement, cela ne change rien car comme les listes crées sont indépendantes, les index de chaque liste n'ont rien à voir entre eux.

    Avec mes données exemples; la liste données contient [0.5, 0.2, 0.4, 0.1, 0.3] et la liste frequence contient [1, 2, 1, 3, 2] : si je demande de trier la liste des données, comme les index des 2 listes ne sont pas liés, les données ne seront plus associées aux bonnes fréquences.


    J'ai essayé une autre solution, qui m'est venue en lisant ta réponse : je fais le tri du vecteur tau directement après sa création via le fichier texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tau = np.array([0.1, 0.2, 0.5, 0.4, 0.1 , 0.3, 0.3, 0.2, 0.1])
    tau.sort()
    Quand je l'affiche, j'obtiens bien les valeurs de tau par valeurs croissantes : [0.1 0.1 0.1 0.2 0.2 0.3 0.3 0.4 0.5] --> je pensais que le passage par ce tri inciterait Python a "trier" tout seul les valeurs dans le tuple (labels, valeurs) ce qui n'est pas le cas : je me retrouve donc dans le même cas que précédemment (j'ai bien les bonnes valeurs associées aux bons labels mais dans la représentation graphique, les labels restent non triés).

    Merci
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    tau = np.array(sorted([0.1, 0.2, 0.5, 0.4, 0.1, 0.3, 0.3, 0.2, 0.1]))
     
    labels, valeurs = zip(*Counter(tau).items())
    donnees = list(labels)
    frequence = list(valeurs)
     
    print(donnees)
     
    index = np.arange(len(labels))
    index2 = np.arange(len(donnees))
    width = 0.35
    rects1 = plt.bar(index, valeurs, width, align="edge")
    rects2 = plt.bar(index2, frequence, width, align="edge")
     
    maxfreq = max(valeurs)
    maxfreq2 = max(frequence)
    minfreq = min(valeurs)
    minfreq2 = min(frequence)
     
    xmin, xmax = tau.min(), tau.max()
    dx = (xmax - xmin)*0.1
     
    plt.xlabel(r"Valeur de $\tau (s)$")
    plt.ylabel("Fréquence")
     
    plt.xticks(index2 + width * 0.5, donnees)
     
    plt.show()

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Alors chez moi, trier la donnée en entrée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tau = np.array([0.1, 0.2, 0.5, 0.4, 0.1 , 0.3, 0.3, 0.2, 0.1])
    tau.sort()
    produit le résultat voulu ...


    Au lieu d'essayer de trier juste une partie des données, vous avez essayez en faisant directement le tri sur list(Counter(tau).items())
    Et sinon pour être sûr il faut trier les items du Counter, comme je vous l'avais suggéré, et ca marche aussi très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    counter_items = list(Counter(tau).items())
    counter_items.sort()
    labels, valeurs = zip(*counter_items)
    Edit : Au passage, faites un print de counter_items, et vous verrez que ce que vous pensiez ne rien avoir entre eux, et bien si, ils ont qqch à avoir entre eux et ca se passe là !

  8. #8
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut
    Salut
    Citation Envoyé par lg_53 Voir le message
    Alors chez moi, trier la donnée en entrée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tau = np.array([0.1, 0.2, 0.5, 0.4, 0.1 , 0.3, 0.3, 0.2, 0.1])
    tau.sort()
    produit le résultat voulu ...
    Pour moi, ça ne veut pas se trier juste en triant tau.

    Citation Envoyé par lg_53 Voir le message
    Et sinon pour être sûr il faut trier les items du Counter, comme je vous l'avais suggéré, et ca marche aussi très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    counter_items = list(Counter(tau).items())
    counter_items.sort()
    labels, valeurs = zip(*counter_items)
    Edit : Au passage, faites un print de counter_items, et vous verrez que ce que vous pensiez ne rien avoir entre eux, et bien si, ils ont qqch à avoir entre eux et ca se passe là !
    J'ai mal compris ce que tu m'avais indiqué donc quand j'essayais, cela ne fonctionnait pas mais avec ce que tu m'as renvoyé, c'est bon tout fonctionne.
    Merci
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/08/2009, 20h20
  2. [CR9] [CRXI] Problème de mise en forme sur un nom de groupe
    Par Maltus dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 06/09/2006, 10h32
  3. [VBA_E] Problème de mise ne forme,pour balayage
    Par baptbapt dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 29/08/2006, 13h33
  4. [VBA] Problème enregistrement mise en forme fichier word
    Par guenfood dans le forum VBA Word
    Réponses: 1
    Dernier message: 07/06/2006, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo