1. #1
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    845
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 845
    Points : 577
    Points
    577

    Par défaut Simple courbe avec matplotlib

    Bonjour,

    Je souhaiterais afficher une simple courbe avec matplotlib mais cela ne marche pas.
    En fait je pars d'un fichier texte "data.txt" composé de deux colonnes et qui ressemble à ça :


    1 216
    2 109
    3 730
    4 549
    5 441
    6 368
    7 317
    8 278
    9 245
    10 223

    A partir de cela je souhaiterais faire une courbe où la première colonne serait l'axe des "x" et la second des "y".
    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
     
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
     
    import Tkinter
    import numpy
    import matplotlib
     
    from numpy import *
    import matplotlib.pyplot as plt
     
    data  = fromfile('data.txt', 'float32')
     
    col1     = data[::1]
    col2     = data[::2]
     
    plt.plot(col1,col2)
    #plt.loglog(col1,col2)
     
    plt.show()
    J'obtiens le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ValueError: x and y must have same first dimension
    Et lorsque j'affiche "col1" ou col2" je ne retrouve pas les valeurs du fichier "data.txt" (j'ai n'importe quoi qui s'affice).

    Connaissez-vous une manière de lire par colonne(pas un fichier binaire) proprement en python puis d'afficher un graphique à partir de ces colonnes?

    Merci de votre aide.

  2. #2
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 925
    Points : 2 943
    Points
    2 943

    Par défaut

    Ton problème vient apparemment de la mauvaise utilisation de numpy, faire des print pour te rendre compte de ton erreur.

    Pour quelquechose d'aussi simple, prendre des choses connues et simples n'est pas une mauvaise idée en soi.

    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
    import matplotlib.pyplot as plt
     
    x = []
    y = []
     
    with open('data.txt', 'r') as f:
        lines = [line.strip() for line in f.readlines()]
     
    for line in lines:
        col1, col2 = line.split()
        x.append(int(col1))
        y.append(int(col2))
     
    plt.plot(x, y)
    plt.show()
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    845
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 845
    Points : 577
    Points
    577

    Par défaut

    OK, merci beaucoup de ton aide.

    Je pensais que l'on pouvait lire chaque colonne d'un seul coup.

    Merci encore

  4. #4
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 925
    Points : 2 943
    Points
    2 943

    Par défaut

    Je pensais que l'on pouvait lire chaque colonne d'un seul coup.
    Tu perdrais beaucoup de temps car tu lirais ta ligne de fichier 2 fois
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    845
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 845
    Points : 577
    Points
    577

    Par défaut

    Une dernier question, comment pourrait-on faire pour repeter cela pour plusieurs fichier.
    Par exemple, afficher sur le même graphique, les courbes issues de "data1.txt", "data2.txt" et "data3.txt" ?

  6. #6
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 925
    Points : 2 943
    Points
    2 943

    Par défaut

    Oui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open(fichier1, 'r') as f, open(fichier2, 'r') as f_1:
        #traitement
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    845
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 845
    Points : 577
    Points
    577

    Par défaut

    J'avais plutôt pensé à

    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 matplotlib.pyplot as plt
    import sys
     
    for i in range(len(sys.argv)):
     
      with open(sys.argv[i], 'r') as f:
     
          x = []
          y = []
          lines = [line.strip() for line in f.readlines()]
     
      for line in lines:
          col1, col2 = line.split()
          x.append(float(col1))
          y.append(float(col2))
     
    plt.loglog(x,y)
    plt.show()
    Mais j'ai l'impression qu'il ne prend pas fichier par fichier.

  8. #8
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 925
    Points : 2 943
    Points
    2 943

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in range(1, len(sys.argv)):
    Je ne savais pas que tu mettais tes fichiers en ligne de commande.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    845
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 845
    Points : 577
    Points
    577

    Par défaut

    J'ai pas tout compris (je vais faire des recherche pour comprendre) mais ça marche très bien.

    Je t'embête une dernière fois.
    Je souhaite afficher comme label le nom de fichier mais sans l'extension.
    Je cherche donc une sorte de éstrncopy" en python, pour avoir "data" au lieu "data.txt".





    C'est bon, j'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string = sys.argv[i][:-4]

    Merci encore pour tout.

  10. #10
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 925
    Points : 2 943
    Points
    2 943

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> import os
    >>> os.path.splitext('data.txt')
    ('data', '.txt')
    >>> fichier, ext = os.path.splitext('data.txt')
    >>> print fichier
    data
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  11. #11
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    845
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 845
    Points : 577
    Points
    577

    Par défaut

    Effectivement c'est plus propre ainsi.

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

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