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 :

matplotlib - courbe à partir de données extraites d'un fichier [Python 3.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 479
    Par défaut matplotlib - courbe à partir de données extraites d'un fichier
    Bonjour,

    J’essaie d'afficher une courbe à partir de données extraites d'un fichier qui sont sous la forme:
    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
     0.00; 0.14
     0.02; 0.17
     0.04; 0.18
     0.06; 0.16
     0.08; 0.15
     0.10; 0.19
     0.12; 0.24
     0.14; 0.29
     0.17; 0.28
     0.19; 0.30
     0.21; 0.29
     0.24; 0.29
     0.26; 0.31
     0.29; 0.33
     0.31; 0.31
     0.34; 0.33
     0.36; 0.34
     0.39; 0.37
     0.41; 0.39
     0.43; 0.41
     0.46; 0.44
     0.48; 0.47
    Le problème est que j'arrive à un résultat comme celui-ci:
    Nom : 2018-10-19_14h31_44.jpg
Affichages : 3061
Taille : 17,6 Ko

    Ci-joint ma fonction:
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    def CaulkingCurve(self, DATA_CURVE, START_OF_DATA_CURVE, iLine):
     
            TMP_DATA_CURVE   = []
            KRAFT_DATA_CURVE = []
            WEG_DATA_CURVE   = []
            #plt.title(Curve)
            host = host_subplot(111)
            host.set_xlabel("Course (mm)")
            host.set_ylabel("Effort")
     
     
            #Normal curve or calibration curve
            #print(len(DATA_CURVE[0].split()))
            try:
                #If classic curve
                if len(DATA_CURVE[0].split()) == 2:
                    print('Classic Caulking curve')
     
                    #Now we prepare data for matplotlib curve
                    for x in range(0, iLine-START_OF_DATA_CURVE): 
                        #print(DATA_CURVE[x].split(";"))
                        TMP_DATA_CURVE.append(DATA_CURVE[x].split(";"))
                        WEG_DATA_CURVE.append(TMP_DATA_CURVE[x][0])
                        KRAFT_DATA_CURVE.append(TMP_DATA_CURVE[x][1])
     
                    #print(WEG_DATA_CURVE)
                    SELECTED_CURVE_WEG   = ",".join(WEG_DATA_CURVE)
                    SELECTED_CURVE_KRAFT = ",".join(KRAFT_DATA_CURVE)
                    _SELECTED_CURVE_WEG   = [SELECTED_CURVE_WEG]
                    _SELECTED_CURVE_KRAFT = [SELECTED_CURVE_KRAFT]
     
     
                    p1, = host.plot(_SELECTED_CURVE_WEG, _SELECTED_CURVE_KRAFT, label=Curve)
                    plt.show()
     
                #If calibration curve    
                elif len(DATA_CURVE[0].split()) == 3:
                    print('Calibration curve')
                    #Your code here....
     
                else:
                    print('No data')
                    messagebox.showwarning("XPress info", "No caulking curve available")
            except:
                print('No data for curve')
                messagebox.showwarning("XPress info", "No caulking curve available")

  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
    Je n'ai pas lu tout votre code dans le détail mais votre lecture de fichier à l'air un peu bancal. Vous printez les choses à l'écran à la fin de la lecture pour voir si c'est bon ?

    Je conseillerais plutôt de passer par
    https://docs.scipy.org/doc/numpy/ref...y.loadtxt.html
    pour lire votre fichier. Pas de gestion du nombre de colonnes à parser, c'est automatique. Pas à transformer les string en floatant c'est aussi automatique. Vous récupérer directement un numpy array à partir du fichier. Et selon le nombre de colonnes vous réaliser le plot qu'il faut.

    D'ailleurs j'ai l'impression que vous essayer de tracer qqch en donnant à la fonction plot une chaine de caractère, ce qui n'est bien évidemment pas bon (il vous faut un array de nombre).

    Ensuite pourquoi self en argument alors qu'on ne le voit pas dans le code de la fonction ?
    Si c'est parce que vous avez une classe dans ce cas c'est une staticmethod, et vous enlevez le self ...

    On n'a pas non plus l'ensemble des paramètres d'appel de votre fonction pour pouvoir la tester et comprendre ce qui vous arrive ...

  3. #3
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut
    Bonsoir, ce code m'a l'air très compliqué (et semble faire partie d'une classe vu la présence du mot clé self ?)
    Un code comme celui là devrait marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from matplotlib.pyplot import plot,show
    with open("fichier.txt") as f:
        x,y=[],[]
        for line in f:
            a,b=(int(k) for k in line.split(';'))
            x+=[a]
            y+=[b]
    plot(x,y)
    show()
    où fichier.txt est le fichier de la forme que vous avez indiquée, située dans le chemin par défaut de python (probablement le même dossier où est situé votre programme).
    Bon courage.

  4. #4
    Membre éclairé
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 479
    Par défaut
    Bon, j'ai changé de direction...

    Je récupère les valeur d'une autre application mais j'ai le même problème...

    Mon code python:
    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
    import sys
    import glob
    import os
    import numpy as np
     
    import matplotlib.pyplot as plt
    from matplotlib.pyplot import *
     
    FROM_PARAM_INDEX = 1
    TO_PARAM_INDEX = 2
     
    LIST_FROM = sys.argv[FROM_PARAM_INDEX]
    LIST_TO = sys.argv[TO_PARAM_INDEX]
     
    fig = plt.figure()
    ax = fig.add_subplot(111)
     
    WEG_Curve_1 = np.array([LIST_FROM])
    KRAFT_Curve_1 = np.array([LIST_TO])
    p1, = plt.plot(WEG_Curve_1, KRAFT_Curve_1)
     
    plt.xlabel('Course (mm)')
    plt.ylabel('Effort (kN)')
    #plt.axis("equal")
    plt.xlim(-0.5, 5)
    plt.show()
    Merci par avance...

  5. #5
    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
    On ne peut pas faire tourner votre code en l'état. Il faut nous fournir tout ce qu'il faut (à vous de réduire si tout c'est trop)

  6. #6
    Membre expérimenté
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Par défaut
    Ton code corrigé :

    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
    import numpy as np
    import matplotlib.pyplot as plt
     
    # j'ai remplacé les sys.arg pour avoir des données
    LIST_FROM = [0, 0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.17, 0.19, 0.21, 0.24, 0.26, 0.29, 0.31, 0.34, 0.36, 0.39, 0.41, 0.43, 0.46, 0.48]
    LIST_TO = [0.14, 0.17, 0.18, 0.16, 0.15, 0.19, 0.24, 0.29, 0.28, 0.3, 0.29, 0.29, 0.31, 0.33, 0.31, 0.33, 0.34, 0.37, 0.39, 0.41, 0.44, 0.47]
     
    fig = plt.figure()
    ax = fig.add_subplot(111)
     
    WEG_Curve_1 = np.asarray(LIST_FROM) # regarde exactement ce que donne np.array([LIST_FROM]) dans le prompt. Utilise la méthode shape pour bien voir la différence
    KRAFT_Curve_1 = np.asarray(LIST_TO)
    p1 = plt.plot(WEG_Curve_1, KRAFT_Curve_1) # j'ai viré la virgule après p1 car p1 = est différent de p1, =
     
    plt.xlabel('Course (mm)')
    plt.ylabel('Effort (kN)')
    #plt.axis("equal")
    plt.xlim(-0.5, 5)
    plt.show()

  7. #7
    Membre éclairé
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 479
    Par défaut
    Bonjour,

    Donc j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(WEG_Curve_1.shape)
    et j'ai (1,) en retour... J'ai essayé votre code avec np.asarray et même résultat...

    Dans le prompt si je fait print(LIST_FROM) et print(LIST_TO) j'ai bien toute mes valeurs...

  8. #8
    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
    Le code de supernul fonctionne. Donc si vous n'avez pas la même chose il faut vous creusez la tête sur les entrées. Notamment LIST_FROm et LIST_TO comme vous l'avez fait, mais il ne faut pas les printer dans la console avec le prompt. Faites le print après les avoir créer dans votre programme. Votre programme peut très bien modifier ces variables là, donc à la fin de son éxécution elle peuvent petre bonne. Mais si ca se trouve au moment où vont en avez besoin elles ne le sont pas encore.

  9. #9
    Membre éclairé
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 479
    Par défaut
    Je pense que c'est un problème de conversion de données entre ce que je récupère de mon application mère et ce que j'envoie via numpy... mais après je ne connaît pas assez python pour faie la distinction...

  10. #10
    Membre éclairé
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 479
    Par défaut
    Je pense que c'est un problème de conversion de données entre ce que je récupère de mon application mère et ce que j'envoie via numpy... mais après je ne connaît pas assez python pour faire la distinction...

    C'est extraordinaire, j'envoie le résultat dans un fichier texte, pas de soucis dans mon fichier sont stocké les bonnes valeurs, je mets celle-ce entre crochet, je les colle dans mon prog et ma courbe s'affiche... c'est franchement compliqué numpy... ça fait plusieurs jours que je cherche sur le net, chacun y va de sa sauce...

    EDIT:

    Je viens de voir dans la console: Sur une courbe qui s'affiche correctement, je n'ai pas les virgules entre chaque valeurs:
    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
    [ 0.32  0.34  0.36  0.39  0.42  0.46  0.5   0.55  0.61  0.66  0.71  0.76
      0.81  0.86  0.91  0.95  0.99  1.02  1.07  1.11  1.16  1.21  1.26  1.32
      1.39  1.45  1.53  1.61  1.69  1.76  1.85  1.93  2.02  2.09  2.16  2.24
      2.32  2.39  2.46  2.53  2.6   2.66  2.72  2.78  2.84  2.89  2.93  2.98
      3.04  3.08  3.13  3.18  3.24  3.28  3.33  3.37  3.41  3.46  3.5   3.54
      3.63  3.82  4.1   4.4   4.76  5.12  5.48  5.83  6.18  6.51  6.82  7.11
      7.39  7.63  7.86  8.06  8.25  8.41  8.6   8.82  9.07  9.36  9.69 10.02
     10.34 10.67 10.99 11.3  11.61 11.9  12.18 12.42 12.64 12.83 12.99 13.13
     13.27 13.38 13.48 13.57 13.63 13.7  13.73 13.77 13.8  13.82 13.85 13.88
     13.9  13.93 13.96 13.98 14.   14.01 14.02 14.03 14.04 14.05 14.05 14.08
     14.09 14.1  14.11 14.11 14.1  14.08 14.05 14.   13.92 13.82 13.69 13.53
     13.31 13.05 12.74 12.37 11.94 11.47 10.95 10.4   9.82  9.23  8.63  8.04
      7.45  6.9   6.36  5.85  5.38  4.95  4.56  4.2   3.88  3.59  3.34  3.12
      2.93  2.79  2.66  2.55  2.45  2.36  2.28  2.2   2.13  2.06  1.99  1.92
      1.86  1.8   1.74  1.68]
    Alors que dans mon script, j'ai les virgules entre chaque valeur...

  11. #11
    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
    C'est très bizarre ton histoire. Normalement tracer une courbe à partir d'un fichier c'est 2-3 lignes de codes seulement ! 1 ligne pour charger, 1 ligne pour tracer !

    Envoie ton fichier de données pour voir.

  12. #12
    Membre éclairé
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 479
    Par défaut
    Je suis bien d'accord avec toi, mais dans mon cas, les valeurs doivent être mises dans un array car pour chaque fichier que je vais ouvrir la courbe sera differente.

    Mes questions sont:
    >Que retourne sys.argv? Une chaîne de caractère, un array?
    >quelle mise en forma pour np.array > np.array([xxxx]) ou np.array()?

  13. #13
    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 existe des fonctions qui directement te lise un fichier et te mettent le contenu dans un array. Donc je te demande le fichier...

  14. #14
    Membre éclairé
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 479
    Par défaut
    Voici le fichier
    Fichiers attachés Fichiers attachés

  15. #15
    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
    Lol ca me rappelle un autre post ce fichier là ! Je regarde celà et vous dis.

  16. #16
    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
    Donc exactement comme je le disais en 2-3 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import numpy as np
    from matplotlib import pyplot as plt
     
    file = "monfichier.txt"
    data = np.loadtxt(file, skiprows=20, delimiter=';')
    plt.plot(data[:,0] , data[:,1] )
    Si vous faites print(data) vous vous rendrez compte que c'est direct un array. Ensuite j'ai supposé que les premières lignes du fichier d'entrée sont tous le temps structurées de la même manière (et donc on commence la lecture à la ligne 20 (on en saute 19)). Si ce n'est pas le cas, il faudra adapter un peu pour calculer ce paramètre avant.

    sys.argv renvoit une liste de chaine de caractère. C'est la liste des arguments que vous donner à votre programme python lorsque vous l'éxécuter en ligne de commande. Donc à priori ca vous permet de récupérer la variable que j'ai nommé file, mais aucunement un array.

  17. #17
    Membre éclairé
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 479
    Par défaut
    Ah bin merci, vu comme ça c'est beaucoup plus rapide effectivement... je ne connaissais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plt.plot(data[:,0] , data[:,1] )
    Merci, sujet résolut, et à bientôt pour de nouveaux problèmes

  18. #18
    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
    Citation Envoyé par Supernatural Voir le message
    Ah bin merci, vu comme ça c'est beaucoup plus rapide effectivement... je ne connaissais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plt.plot(data[:,0] , data[:,1] )
    Merci, sujet résolut, et à bientôt pour de nouveaux problèmes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plt.plot(data[:,0] , data[:,1] )
    évite d'avoir à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x=data[:,0]
    y=data[:,1]
    plt.plot(x,y )

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

Discussions similaires

  1. tracer des courbes à partir des données Excel
    Par jeunehomme dans le forum MATLAB
    Réponses: 5
    Dernier message: 26/03/2015, 22h38
  2. Réponses: 13
    Dernier message: 20/04/2013, 14h00
  3. Réponses: 8
    Dernier message: 25/07/2010, 10h15
  4. Réponses: 1
    Dernier message: 25/01/2010, 23h07
  5. [JGraph]dessiner une courbe à partir de données
    Par marwaza22 dans le forum 2D
    Réponses: 1
    Dernier message: 16/11/2006, 16h16

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