Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

utilisation de contour3D matplotlib



  1. #1
    gatsu

    utilisation de contour3D matplotlib


    ------

    Bonjour à tous,

    J'essaie de tracer un contour 3D ou une surface à partir de données numériques. En gros j'ai un fichier avec trois colonnes x,y et z et je veux tracer la surface correspondante. Je suis un super newbie en python et j'essaie tant bien que mal de ploter cette surface.

    Voilà le code que j'ai essayé :

    Code:
    #!/usr/bin/python
    
    from numpy import *
    import pylab as p
    import sys
    import mpl_toolkits.mplot3d.axes3d as p3
    
    s = str(sys.argv[1])
    f = open(s)
    z,y,x = loadtxt(f, unpack = True)
    f.close
    deltaV = 1.308167
    #x = [1,2,3]
    #y = [1,2,3]
    #z = [1,8,16]
    data = zip(x,y,z)
    
    #map data on the plane
    X, Y = meshgrid(arange(0, 89, 1), arange(0, 300, 1))
    Z = zeros((len(X),len(Y)),'Float32')
    for x_,y_,z_ in data:
      Z[x_, y_] = z_ #this should work, but only because x and y are integers
                     #and arange was done with a step of 1, starting from 0
    
    fig=p.figure()
    ax = p3.Axes3D(fig)
    ax.contourf(X,Y,Z)
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')
    p.show()


    Avec les vecteurs x, y et z que j'ai commenté plus haut dans le code, le programme fonctionne. Mais maintenant que j'ai cet énorme fichier et que j'essaie de le faire tourner je reçois une erreur qui me dit
    " TypeError("Inputs x and y must be 1D or 2D.")"

    Et je ne comprends pas bien ce que je dois faire pour y remédier.

    En cherchant sur le net certains disent que la forme de Z n'est peut être pas la même que celle de X ou Y mais je ne sais pas quoi faire pour tester ou changer cela...

    En tout cas, si vous avez un conseil merci d'avance !

    -----
    Dernière modification par JPL ; 23/03/2013 à 01h14.
    "Au fond..la musique si on la prend note par note c'est assez nul". Geluck

  2. #2
    fred1599

    Re : utilisation de contour3D matplotlib

    Comme souvent sur les forums, vous ne donnez pas suffisamment d'informations

    1) À quoi ressemblent vos lignes de fichier (séparation, type de données, ...). Le plus simple étant de donner quelques lignes du fichier.
    2) loadtxt renvoi un array, et pour traiter l'ensemble des données, pourquoi faire un unpack?

    En gros le plus simple et de donner quelques lignes, je pourrais plus simplement vous aider en testant de mon côté. La théorie a ses limites...

  3. #3
    gatsu

    Re : utilisation de contour3D matplotlib

    Merci beaucoup pour l'intéret.

    1) je joins à la fin de ce message 20 lignes de mon fichiers (mon code ne marche pas avec ces 20 lignes non plus)

    2) pour ce qui est du "unpack" c'est juste qu'à la base je voulais mettre chaque colonne dans un vecteur et tracer la surface un peu comme sur gnuplot...seulement c'est apparemment beaucoup plus compliqué en python (que ce soit avec plot_surface ou contour).
    Après, je suis tellement nul actuellement que je ne sais même pas si data= zip(x,y,z) a la même forme que si je faisais data=loadtxt(f).

    En tout cas merci vraiment d'avance

    portion du fichier :

    0.025876 139 0
    0.030881 140 0
    0.030982 141 0
    0.035602 142 0
    0.035521 143 0
    0.038479 144 0
    0.040668 145 0
    0.040121 146 0
    0.037953 147 0
    0.039027 148 0
    0.038338 149 0
    0.047557 139 1
    0.045105 140 1
    0.044943 141 1
    0.042370 142 1
    0.042025 143 1
    0.038946 144 1
    0.037953 145 1
    0.033373 146 1
    0.030070 147 1
    0.029118 148 1
    0.025552 149 1
    "Au fond..la musique si on la prend note par note c'est assez nul". Geluck

  4. #4
    fred1599

    Re : utilisation de contour3D matplotlib

    Alors tout d'abord très bon choix que de lire ton fichier avec numpy pour ce type de fichier.

    Ensuite, loadtxt renvoi un array, le traitement de chaque ligne se fera avec une boucle for.

    Si je comprend bien, vous voulez mettre chaque colonne dans un vecteur, votre solution ne peut fonctionner, vous vouliez dire dans vos points x, y et z, non?

    Voilà ce que je ferais

    Code:
    >>> import numpy as np
    >>> data = np.loadtxt("donnees.txt")
    >>> data
    array([[  2.58760000e-02,   1.39000000e+02,   0.00000000e+00],
           [  3.08810000e-02,   1.40000000e+02,   0.00000000e+00],
           [  3.09820000e-02,   1.41000000e+02,   0.00000000e+00],
           [  3.56020000e-02,   1.42000000e+02,   0.00000000e+00],
           [  3.55210000e-02,   1.43000000e+02,   0.00000000e+00],
           [  3.84790000e-02,   1.44000000e+02,   0.00000000e+00],
           [  4.06680000e-02,   1.45000000e+02,   0.00000000e+00],
           [  4.01210000e-02,   1.46000000e+02,   0.00000000e+00],
           [  3.79530000e-02,   1.47000000e+02,   0.00000000e+00],
           [  3.90270000e-02,   1.48000000e+02,   0.00000000e+00],
           [  3.83380000e-02,   1.49000000e+02,   0.00000000e+00],
           [  4.75570000e-02,   1.39000000e+02,   1.00000000e+00],
           [  4.51050000e-02,   1.40000000e+02,   1.00000000e+00],
           [  4.49430000e-02,   1.41000000e+02,   1.00000000e+00],
           [  4.23700000e-02,   1.42000000e+02,   1.00000000e+00],
           [  4.20250000e-02,   1.43000000e+02,   1.00000000e+00],
           [  3.89460000e-02,   1.44000000e+02,   1.00000000e+00],
           [  3.79530000e-02,   1.45000000e+02,   1.00000000e+00],
           [  3.33730000e-02,   1.46000000e+02,   1.00000000e+00],
           [  3.00700000e-02,   1.47000000e+02,   1.00000000e+00],
           [  2.91180000e-02,   1.48000000e+02,   1.00000000e+00],
           [  2.55520000e-02,   1.49000000e+02,   1.00000000e+00]])
    
    >>> for vector in data:
    ...     x, y, z = vector # x, y et z représentant chacun un point
    ...     # traitement des points x, y et z

  5. A voir en vidéo sur Futura
  6. #5
    gatsu

    Re : utilisation de contour3D matplotlib

    ce que je voulais faire au début était d'un avoir un vecteur X correspondant à la première colonne, Y correspondant à la deuxième colonne et Z à la troisième. Sous le logiciel gnuplot par exemple il suffit de dire 'plot "data.dat" using X,Y,Z' pour qu'il trace un nuage de points de coordonnées (X[i],Y[i],Z[i]).

    Je pensais que les fonctions de matplolib fonctionnait comme cela mais ce n'est apparemment pas le cas.

    Au final, tout ce que je voudrais c'est "simplement" tracer une surface simple qui passe par le nuage de points qui se trouve dans data.dat.

    C'est normalement des fonctions de type plot_surface() ou contour() qui me le permettent mais ces fonctions prennent en entrée des x,y et z qui sont à deux dimensions et le bout de code que j'ai écrit est censé les mettre dans le format adéquat...sauf que ça marche pas.
    "Au fond..la musique si on la prend note par note c'est assez nul". Geluck

  7. #6
    fred1599

    Re : utilisation de contour3D matplotlib

    Ok je crois piger, je viens de voir la doc matplotlib et tu ne peux faire que des nuages de points 2D, je me trompe?

    Dis moi si ça te conviens

    Code:
    # -*- coding:utf8 -*-
    
    from pylab import *
    import numpy as np
    
    def generate(list_X, list_Y, path):
        scatter(list_X, list_Y, c='r')
        savefig(path)
        show()
    
    list_X, list_Y = [], []
    
    data = np.loadtxt("donnees.txt")
    
    for coord in data:
        x, y, z = coord
        list_X.append(x)
        list_Y.append(y)
    
    generate(list_X, list_Y, "graph.jpg")

  8. #7
    fred1599

    Re : utilisation de contour3D matplotlib

    En 3D peut-être?

    Code:
    # -*- coding:utf8 -*-
    
    from pylab import *
    import numpy as np
    
    def generate(list_X, list_Y, list_Z, path):
        scatter(list_X, list_Y, list_Z, c='r')
        savefig(path)
        show()
    
    list_X, list_Y = [], []
    list_Z = []
    
    data = np.loadtxt("donnees.txt")
    
    for coord in data:
        x, y, z = coord
        list_X.append(x)
        list_Y.append(y)
        list_Z.append(z)
    
    generate(list_X, list_Y, list_Z, "graph.jpg")

  9. #8
    gatsu

    Re : utilisation de contour3D matplotlib

    j'ai essayé ce morceau de code mais ça me dessine quelque chose dans le plan...je sais pas trop quoi d'ailleurs. J'arrive pas à voir à quoi sert la troisième colonne là dedans.
    "Au fond..la musique si on la prend note par note c'est assez nul". Geluck

Discussions similaires

  1. Utilisation proteus et isis, demande d'aide utilisation pour isis.
    Par stephane85 dans le forum Électronique
    Réponses: 0
    Dernier message: 15/06/2012, 09h03
  2. Utilisation de XL et ZL
    Par chess_yuss dans le forum Physique
    Réponses: 1
    Dernier message: 16/05/2011, 16h27
  3. QR - Utilisation du PER
    Par RSSBot dans le forum Commentez les actus, dossiers et définitions
    Réponses: 0
    Dernier message: 04/02/2011, 23h07
  4. Utilisation de la ti 89
    Par maria972 dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 21/06/2010, 12h54
  5. Python et Matplotlib
    Par Jeremie73 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 13/12/2007, 10h41