Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité régulier
    Inscrit en
    avril 2012
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : avril 2012
    Messages : 26
    Points : 7
    Points
    7

    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

  2. #2
    Membre éprouvé
    Homme Profil pro Thomas Pegot
    Ingénieur développement logiciels
    Inscrit en
    janvier 2012
    Messages
    274
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Pegot
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2012
    Messages : 274
    Points : 424
    Points
    424

    Par défaut

    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

  3. #3
    Invité régulier
    Inscrit en
    avril 2012
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : avril 2012
    Messages : 26
    Points : 7
    Points
    7

    Par défaut

    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

  4. #4
    Membre éprouvé
    Homme Profil pro Thomas Pegot
    Ingénieur développement logiciels
    Inscrit en
    janvier 2012
    Messages
    274
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Pegot
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2012
    Messages : 274
    Points : 424
    Points
    424

    Par défaut

    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)

  5. #5
    Invité régulier
    Inscrit en
    avril 2012
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : avril 2012
    Messages : 26
    Points : 7
    Points
    7

    Par défaut

    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
    ...

  6. #6
    Membre éprouvé
    Homme Profil pro Thomas Pegot
    Ingénieur développement logiciels
    Inscrit en
    janvier 2012
    Messages
    274
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Pegot
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2012
    Messages : 274
    Points : 424
    Points
    424

    Par défaut

    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)
    ...

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
  •