Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre expérimenté Avatar de LinuxUser
    Inscrit en
    avril 2007
    Messages
    806
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 806
    Points : 506
    Points
    506

    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 :
    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 :
    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 :
    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 Expert

    Homme Profil pro Bastien Montagne
    Diverses et multiples
    Inscrit en
    mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Nom : Homme Bastien Montagne
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : mai 2008
    Messages : 662
    Points : 1 179
    Points
    1 179

    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)*?
    Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques

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

    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 :
    1
    2
    3
    4
    5
    1.53837e-15
    0.00195135
    0.00390215
    0.00585237
    0.00780202
    Y.txt
    Code :
    1
    2
    3
    4
    5
    30.4912
    32.0847
    33.6407
    35.1677
    36.6658

  4. #4
    Membre Expert

    Homme Profil pro Bastien Montagne
    Diverses et multiples
    Inscrit en
    mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Nom : Homme Bastien Montagne
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : mai 2008
    Messages : 662
    Points : 1 179
    Points
    1 179

    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 :
    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…
    Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques

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

    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 Expert

    Homme Profil pro Bastien Montagne
    Diverses et multiples
    Inscrit en
    mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Nom : Homme Bastien Montagne
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : mai 2008
    Messages : 662
    Points : 1 179
    Points
    1 179

    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).
    Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •