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 :

Tracer une courbe avec données issues deux fichiers textes


Sujet :

Python

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Tracer une courbe avec données issues deux fichiers textes
    Bonjour,

    Je ne connais pas du tout le python et je souhaite tracer une courbe y en fonction de x avec des données issues de Y.txt et X.txt qui ressemble à cela:
    Y.txt
    X.txt
    Pour cela j'utilise Matplotlib en stockant dans un tableau différent les données issues de chaque fichier, mais le problème est que je n'arrive pas à créer le graphique car j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    raise ValueError("x and y must have same first dimension")
    ValueError: x and y must have same first dimension
    Voici le script:
    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
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
    from numpy import *
    import matplotlib.pyplot as plt
     
    dataG  = fromfile('X.txt', 'float32')
    dataC  = fromfile('Y.txt', 'float32')
     
    x     = dataG[::1]
    y     = dataC[::1]
     
     
    plt.plot(x, y) #je precise que les deux fichiers ont le même nombres de lignes
     
    plt.xlabel('Energy [MeV]')
    plt.ylabel('Nb particles')
    plt.legend()
    plt.show()
    J'ai trouvé une solution qui marche en bidouillant un script existant, mais j'aimerai bien faire fonctionner mon script et comprendre pourquoi il ne marche pas, voici le deuxième script:
    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
    # -*- coding: iso-8859-1 -*-
    import matplotlib.pyplot as plt
    import sys
    import os
     
    #for i in range(1, len(sys.argv)):
    f1 = open(sys.argv[1], 'r')
     
    x = []
    lines = [line.strip() for line in f1.readlines()]
     
    for line in lines:
      col1 = line.split()
      x.append(col1)
     
    f2 = open(sys.argv[2], 'r')
     
    y = []
    lines = [line.strip() for line in f2.readlines()]
     
    for line in lines:
      col2 = line.split()
      y.append(col2)
     
    #string, ext = os.path.splitext(sys.argv[i])
    plt.plot(x, y)
     
    plt.xlabel('epsilon')
    plt.ylabel('MPa')
    plt.legend()
    plt.show()

    Merci de votre aide.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Ben, clairement, x et y n’ont pas la même taille (un print(len(x), len(y) devrait le confirmer)…

    Après, si les deux fichiers ont vraiment le même nombre de lignes… Peut-être essayer de reproduire le problème avec deux fichiers ne comportant que quelques lignes, en faisant un print des deux listes obtenues (et si le problème persiste, nous les copier ici, qu’on puisse tester)*?

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    J'ai rédius les deux fichiers à 5 lignes chacun et le print me donne:
    J'ai pas compris ces valeurs.

    Est-ce qu'il y a une bonne ou dumoins une meilleure façon de faire ce que je souhaite?

    EDIT: voici les deux fichiers à présent:

    X.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1.53837e-15
    0.00195135
    0.00390215
    0.00585237
    0.00780202
    Y.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    30.4912
    32.0847
    33.6407
    35.1677
    36.6658

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Ces deux valeurs sont les longueurs de tes deux listes, qui ne collent effectivement pas du tout aux données*!

    Un petit tour sur la doc de numpy.fromfile nous apprend que pour utiliser le fichier en mode texte, il faut spécifier un séparateur (sinon, il est “lu” en mode binaire, ce qui donne évidemment n’importe quoi dans ce cas précis ) –*ici, le séparateur est le retour à la ligne ('\n'). Ce code devrait donc marcher*:

    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
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
    from numpy import *
    import matplotlib.pyplot as plt
     
    dataG  = fromfile('X.txt', 'float32', sep='\n')
    dataC  = fromfile('Y.txt', 'float32', sep='\n')
     
    x     = dataG[::1]
    y     = dataC[::1]
     
     
    plt.plot(x, y) #je precise que les deux fichiers ont le même nombres de lignes
     
    plt.xlabel('Energy [MeV]')
    plt.ylabel('Nb particles')
    plt.legend()
    plt.show()
    PS*: Quel est l’intérêt de copier dataG et dataC dans x et y*?

    PPS*: Il fleure bon le CERN, ce code…

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Ces deux valeurs sont les longueurs de tes deux listes, qui ne collent effectivement pas du tout aux données*!

    Un petit tour sur la doc de numpy.fromfile nous apprend que pour utiliser le fichier en mode texte, il faut spécifier un séparateur (sinon, il est “lu” en mode binaire, ce qui donne évidemment n’importe quoi dans ce cas précis ) –*ici, le séparateur est le retour à la ligne ('\n'). Ce code devrait donc marcher*:
    En effet, merci beaucoup.
    Citation Envoyé par mont29 Voir le message
    PS*: Quel est l’intérêt de copier dataG et dataC dans x et y*?
    Je pensais que dataG et dataC était des genre de "stream" pour lire les fichiers et que pour récupéer les données il fallait un tablea pour les contenir en l'occurence ici x et y.
    Je peux donc utiliser datdC et dataG directement? Je vais tester.
    J'avoue que j'ai plus fait par analogie qu'autre chose.

    Citation Envoyé par mont29 Voir le message
    PPS*: Il fleure bon le CERN, ce code…
    Bien vu

  6. #6
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    dataG et dataC sont des “arrays” numpy (un genre de liste optimisée, pour faire simple). Donc pas de problème pour les utiliser directement (normalement).

    De plus, dataG[::1] ne retourne pas une liste, mais un autre array numpy, pour en faire une liste il faut appeler explicitement le “constructeur” de celle-ci*: list(dataG).

Discussions similaires

  1. Tracer une courbe avec couleur dépendant d'une variable
    Par etienne.clopeau dans le forum Calcul scientifique
    Réponses: 9
    Dernier message: 07/03/2009, 20h10
  2. comment tracer une courbe avec gtk
    Par killer_instinct dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 01/10/2007, 22h53
  3. tracer une courbe avec GtkCurve ou autre
    Par coax81 dans le forum GTK+ avec C & C++
    Réponses: 11
    Dernier message: 07/06/2007, 15h47
  4. Tracer une courbe avec GTK+
    Par insa59 dans le forum GTK+ avec C & C++
    Réponses: 11
    Dernier message: 16/03/2007, 15h29
  5. Tracer une courbe avec 2 tableau de points
    Par babarpapa dans le forum 2D
    Réponses: 3
    Dernier message: 19/04/2006, 15h24

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