Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/02/2013, 10h04   #1
LinuxUser
Membre éprouvé
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 749
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 749
Points : 428
Points : 428
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.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 12h32   #2
mont29
Membre Expert
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 624
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 624
Points : 1 037
Points : 1 037
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
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 14h51   #3
LinuxUser
Membre éprouvé
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 749
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 749
Points : 428
Points : 428
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
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 15h23   #4
mont29
Membre Expert
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 624
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 624
Points : 1 037
Points : 1 037
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
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 16h40   #5
LinuxUser
Membre éprouvé
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 749
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 749
Points : 428
Points : 428
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
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 17h09   #6
mont29
Membre Expert
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 624
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 624
Points : 1 037
Points : 1 037
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
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h45.


 
 
 
 
Partenaires

Hébergement Web