Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Calcul scientifique
Calcul scientifique Forum d'entraide sur la programmation scientifique et bibliothèques associées (PIL, NumPy, SciPy, ...)
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 08/06/2012, 10h23   #1
Chefcou
Invité régulier
 
Inscription : avril 2012
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2012
Messages : 26
Points : 6
Points : 6
Par défaut tracer graphe 3d à partir de données numériques

Bonjour,
Je souhaite créer un graphe 3d à partir de trois listes de données.
voici ce que j'ai fait..

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
 
xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))
 
X, Y = np.meshgrid(xi, yi)
Z = griddata(x, y, z, xi, yi)
 
surf = ax.plot_surface(X, Y, Z, rstride=6, cstride=6, cmap=cm.jet,
        linewidth=0)
 
ax.set_zlim3d(min(z), max(z))
 
ax.w_zaxis.set_major_locator(LinearLocator(10))
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))
 
fig.colorbar(surf, shrink=0.5, aspect=5)
 
plt.show()
Par contre, j'ai toujours un message d'erreur à propos de la deuxieme ligne ...
Code :
1
2
3
4
5
6
7
8
>>> ax = fig.add_subplot(111, projection='3d')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/matplotlib/figure.py", line 677, in add_subplot
    projection_class = get_projection_class(projection)
  File "/usr/lib/pymodules/python2.6/matplotlib/projections/__init__.py", line 61, in get_projection_class
    raise ValueError("Unknown projection '%s'" % projection)
ValueError: Unknown projection '3d'
Je ne sais pas comment faire pour résoudre ce probleme
merci d avance pour votre aide
Chefcou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2012, 12h29   #2
Gakusei
Membre éprouvé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 264
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 264
Points : 403
Points : 403
Bonjour,

Les valeurs prises par projection (du module pyplot) sont:
Code :
 ['aitoff','hammer','lambert','mollweide','polar','rectilinear']
Si possible vous pouvez utiliser le module:
Code :
from mpl_toolkits.mplot3d import Axes3D
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2012, 15h03   #3
Chefcou
Invité régulier
 
Inscription : avril 2012
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2012
Messages : 26
Points : 6
Points : 6
Merci pour ta réponse,
Voici ce que j'ai fait :
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
32
33
34
from mpl_toolkits.mplot3d.axes3d import Axes3D
import matplotlib.pyplot as plt
 
 
# imports specific to the plots in this example
import numpy as np
from matplotlib import cm
from mpl_toolkits.mplot3d.axes3d import get_test_data
 
# Twice as wide as it is tall.
fig = plt.figure(figsize=plt.figaspect(0.5))
 
X=[57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997]
Y=[28.1937, 28.1937, 28.1937, 28.1937, 28.1937, 28.1937, 39.331899999999997, 39.331899999999997, 39.331899999999997, 39.331899999999997, 39.331899999999997, 39.331899999999997, 50.470100000000002, 50.470100000000002, 50.470100000000002, 50.470100000000002, 50.470100000000002, 50.470100000000002, 61.608400000000003, 61.608400000000003, 61.608400000000003, 61.608400000000003, 61.608400000000003, 61.608400000000003, 72.746600000000001, 72.746600000000001, 72.746600000000001, 72.746600000000001, 72.746600000000001, 72.746600000000001, 83.884900000000002, 83.884900000000002, 83.884900000000002, 83.884900000000002, 83.884900000000002, 83.884900000000002, 95.023099999999999, 95.023099999999999, 95.023099999999999, 95.023099999999999, 95.023099999999999, 95.023099999999999, 106.161, 106.161, 106.161, 106.161, 106.161, 106.161]
Z=[-1.12331, -1.1246499999999999, -1.1284099999999999, -1.11934, -1.1233299999999999, -1.1230100000000001, -1.00088, -1.0019, -0.99307999999999996, -0.99635399999999996, -0.99544500000000002, -0.99269300000000005, -0.89034899999999995, -0.89257200000000003, -0.89359900000000003, -0.88752500000000001, -0.88253499999999996, -0.87981200000000004, -0.780914, -0.77429400000000004, -0.77657100000000001, -0.77299600000000002, -0.77231000000000005, -0.76889600000000002, -0.66271800000000003, -0.65923500000000002, -0.65848200000000001, -0.65167600000000003, -0.64957100000000001, -0.65037, -0.57327499999999998, -0.57718599999999998, -0.56849400000000005, -0.56994100000000003, -0.56124700000000005, -0.56069000000000002, -0.46647899999999998, -0.46522799999999997, -0.461287, -0.45732400000000001, -0.45951900000000001, -0.45488099999999998, -0.37942199999999998, -0.38104500000000002, -0.378776, -0.38169399999999998, -0.37445899999999999, -0.37913400000000003]
 
 
#---- First subplot
ax = fig.add_subplot(1, 2, 1, projection='3d')
 
X, Y = np.meshgrid(X, Y)
 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
        linewidth=0, antialiased=False)
ax.set_zlim3d(-1.01, 1.01)
 
fig.colorbar(surf, shrink=0.5, aspect=10)
 
#---- Second subplot
ax = fig.add_subplot(1, 2, 2, projection='3d')
X, Y, Z = get_test_data(0.05)
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
 
plt.show()
Par contre cette fois quand je le lance, j'ai un message d'erreur relié à la forme de mes données (Z)
Code :
1
2
3
4
5
  File "graph3.py", line 30, in <module>
    linewidth=0, antialiased=False)
  File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 663, in plot_surface
    rows, cols = Z.shape
AttributeError: 'list' object has no attribute 'shape'
Je ne vois pas comment faire pour résoudre ce probleme, rq j suis débutant sous python,
merci d avance
Chefcou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2012, 15h38   #4
Gakusei
Membre éprouvé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 264
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 264
Points : 403
Points : 403
Tu as plusieurs erreurs.

Z doit être de type np.array pour accéder à l'attribut shape: Z=np.array(Z).

Deplus X et Y sont des matrices 48x48 hors Z n'est qu'une liste de longueur 48. Donc plot_surface te rendra une erreur.

Pour ce problème il existe une fonction pour Z:
griddata du module matplotlib.mlab:
Code :
1
2
from matplotlib.mlab import griddata
help(griddata)
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2012, 18h23   #5
Chefcou
Invité régulier
 
Inscription : avril 2012
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2012
Messages : 26
Points : 6
Points : 6
merci pour ta réponse,
en fait pour la forme de mes vecteurs, normalement les valeurs de X et Y se répètent de telle façon à obtenir une matrice 6*8 .. càd ya 6 valeurs de x et 8 de y qui se répètent à chaque fois .. et les valeurs de z correspondent à une combinaison (x,y). D'ou les 48 chiffres de z.
Moi le but c'est de tracer une cartographie de z ...
j'ai essayé griddata mais j'y arrive pas
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
import matplotlib.pyplot as plt
import matplotlib.tri as tri
import numpy as np
from numpy.random import uniform, seed
from matplotlib.mlab import griddata
import time
 
seed(0)
npts = 48
ngridx = 100
ngridy = 200
x = [57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997, 57.779600000000002, 60.5642, 63.348700000000001, 66.133300000000006, 68.917900000000003, 71.702399999999997] #plage des donnees
y = [28.1937, 28.1937, 28.1937, 28.1937, 28.1937, 28.1937, 39.331899999999997, 39.331899999999997, 39.331899999999997, 39.331899999999997, 39.331899999999997, 39.331899999999997, 50.470100000000002, 50.470100000000002, 50.470100000000002, 50.470100000000002, 50.470100000000002, 50.470100000000002, 61.608400000000003, 61.608400000000003, 61.608400000000003, 61.608400000000003, 61.608400000000003, 61.608400000000003, 72.746600000000001, 72.746600000000001, 72.746600000000001, 72.746600000000001, 72.746600000000001, 72.746600000000001, 83.884900000000002, 83.884900000000002, 83.884900000000002, 83.884900000000002, 83.884900000000002, 83.884900000000002, 95.023099999999999, 95.023099999999999, 95.023099999999999, 95.023099999999999, 95.023099999999999, 95.023099999999999, 106.161, 106.161, 106.161, 106.161, 106.161, 106.161] #plage des 
z = [-1.12331, -1.1246499999999999, -1.1284099999999999, -1.11934, -1.1233299999999999, -1.1230100000000001, -1.00088, -1.0019, -0.99307999999999996, -0.99635399999999996, -0.99544500000000002, -0.99269300000000005, -0.89034899999999995, -0.89257200000000003, -0.89359900000000003, -0.88752500000000001, -0.88253499999999996, -0.87981200000000004, -0.780914, -0.77429400000000004, -0.77657100000000001, -0.77299600000000002, -0.77231000000000005, -0.76889600000000002, -0.66271800000000003, -0.65923500000000002, -0.65848200000000001, -0.65167600000000003, -0.64957100000000001, -0.65037, -0.57327499999999998, -0.57718599999999998, -0.56849400000000005, -0.56994100000000003, -0.56124700000000005, -0.56069000000000002, -0.46647899999999998, -0.46522799999999997, -0.461287, -0.45732400000000001, -0.45951900000000001, -0.45488099999999998, -0.37942199999999998, -0.38104500000000002, -0.378776, -0.38169399999999998, -0.37445899999999999, -0.37913400000000003]
 
# griddata and contour.
start = time.clock()
plt.subplot(211)
xi = np.linspace(57,72,ngridx)
yi = np.linspace(28,107,ngridy)
zi = griddata(x,y,z,xi,yi,interp='linear')
plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
plt.plot(x, y, 'ko', ms=3)
plt.xlim(57,72)
plt.ylim(28,107)
plt.title('griddata and contour (%d points, %d grid points)' % (npts, ngridx*ngridy))
print 'griddata and contour seconds:', time.clock() - start
...
Chefcou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2012, 19h14   #6
Gakusei
Membre éprouvé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 264
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 264
Points : 403
Points : 403
D'accord, dans ce cas il est inutile de faire np.meshgrid et donc griddata, il suffit de remplacer par:
Code :
1
2
3
4
5
6
7
8
 
...
x=np.resize(x, (8,6))
y=np.resize(y, (8,6))
z=np.resize(z, (8,6))
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
        linewidth=0, antialiased=False)
...
Gakusei 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 02h30.


 
 
 
 
Partenaires

Hébergement Web