IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[MATPLOTLIB]Insertion des courants sur une carte : Too many error to unpack


Sujet :

Python

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 11
    Points : 5
    Points
    5
    Par défaut [MATPLOTLIB]Insertion des courants sur une carte : Too many error to unpack
    Bonjour,
    Je tente de modéliser des données météorologiques d'un grib converti en netCDF. Pour ce faire, j'utilise les u-component et v-component.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from netCDF4 import *
    import datetime as dt
    import numpy as np
    import numpy.ma as ma
    from datetime import date, datetime, timedelta
    import matplotlib.pyplot as plt
     
    nc=Dataset('datasets/essai.nc')
     
    time_var = nc.variables[str('forecast_time0')]
    wave_var = nc.variables['DIST_GDS0_SFC']
    lat = nc.variables['g0_lat_1'][:]
    lon = nc.variables['g0_lon_2'][:]
    uin = nc.variables['UOGRD_GDS0_DBSL'][:]
    vin = nc.variables['VOGRD_GDS0_DBSL'][:]
    plt.quiver(lon[::5], lat[::5], uin[::5], vin[::5], scale=200)
    Et voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Traceback (most recent call last):
      File "nctry.py", line 37, in <module>
        plt.quiver(lon[::5], lat[::5], uin[::5], vin[::5], scale=200)
      File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 2877, in quive
    r
        ret = ax.quiver(*args, **kw)
      File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 6627, in quiver
        q = mquiver.Quiver(self, *args, **kw)
      File "C:\Python27\lib\site-packages\matplotlib\quiver.py", line 394, in __init
    __
        X, Y, U, V, C = _parse_args(*args)
      File "C:\Python27\lib\site-packages\matplotlib\quiver.py", line 356, in _parse
    _args
        nr, nc = U.shape
    ValueError: too many values to unpack
    En faisant des recherches sur internet, je suppose que l'erreur vient du contenu des variables uogrd et vogrd mais je ne sais pas comment les manipuler.
    Merci d'avance pour votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut.
    Il y a trop de valeurs. Essaie en tronquant le fichier.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci pour ta réponse,
    J'ai pris un fichier de 120kb à la place des 0.800mb utilisés lors de ma question, et l'erreur m'apparait toujours

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    On ne peut pas savoir pourquoi il y a une erreur sur uin sans avoir le fichier nc.
    A ta place, je contrôlerais les valeurs des 4 tableaux avec un print. Puis leur taille et profil (size and shape).

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Après avoir fait un shape sur chaque variable, j'ai obtenu ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C:\Python27>python nctry.py
    (321,) //lat
    (720,) //lon
    (4, 321, 720) //uin
    (4, 321, 720) //vin
    J'ai donc voulu effectuer un "slice" sur les 1eres valeurs de chaque variable mais cela ne m'affiche qu'une flèche, voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    nc=Dataset('datasets/essai.nc')
     
    lat = nc.variables['g0_lat_1']
    lat = np.array(lat)
    lat = lat.shape
    lat = lat[:1]
    lon = nc.variables['g0_lon_2']
    lon = np.array(lon)
    lon = lon.shape
    lon = lon[:1]
    uin = nc.variables['UOGRD_GDS0_DBSL']
    uin = np.array(uin)
    uin = uin.shape
    uin = uin[:1]
    vin = nc.variables['VOGRD_GDS0_DBSL']
    vin = np.array(vin)
    vin = vin.shape
    vin = vin[:1]
     
    lons, lats = np.meshgrid(lon,lat)
     
    plt.quiver(lons, lats, uin, vin)
    plt.show()
    Et ça ne me renvoie qu'une seule flèche. Je ne sélectionne qu'un élément en faisant ça?

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Bonjour.
    C:\Python27>python nctry.py
    (321,) //lat
    (720,) //lon
    (4, 321, 720) //uin
    (4, 321, 720) //vin
    Pourquoi les tableaux uin et vin sont-ils de rang 3 ? A quoi correrspond la première dimension ?

    Je peux te donner un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import numpy as np
    from numpy.random import random_sample
    import matplotlib.pyplot as plt
     
    nb_lat, nb_lon = 5, 9
    X = np.arange(nb_lon)
    Y = np.arange(nb_lat)
    U = np.cos(2*np.pi*random_sample(nb_lat*nb_lon)).reshape(nb_lat,-1)
    V = np.sin(2*np.pi*random_sample(nb_lat*nb_lon)).reshape(nb_lat,-1)
     
    print( X.shape, Y.shape, U.shape, V.shape)
     
    plt.quiver( X, Y, U, V)
    plt.show()
    Les profils :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (9,) (5,) (5, 9) (5, 9)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    lat = nc.variables['g0_lat_1']
    lat = np.array(lat)
    lat = lat.shape
    lat = lat[:1]
    ...
    lons, lats = np.meshgrid(lon,lat)
    lat vaut le nombre d'éléments sur la première dimension. Les données lues ont été perdues.
    Comme c'est un scalaire, il n'y a qu'un seul point dans la grille calculée par meshgrid.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse,
    Cependant, débarquant dans le monde de python, slicing, et compagnie, je ne pourrais pas te dire à quoi correspond la 1ere valeur. Y a-t-il un moyen de le savoir? Peut être l'orientation de la flêche?

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,

    Cependant, débarquant dans le monde de python, slicing, et compagnie, je ne pourrais pas te dire à quoi correspond la 1ere valeur. Y a-t-il un moyen de le savoir? Peut être l'orientation de la flêche?
    Non, on ne peut pas le savoir sans connaitre le fichier des données (et la bibliothèque netCDF4).

    Pour avancer, tu peux fixer une valeur du premier indice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uin = np.array(nc.variables['UOGRD_GDS0_DBSL'])[0,:,:]
    et ensuite créer un quiver.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    J'ai donc essayé de fixer les valeurs en faisant
    u = np.array(nc.variables['UOGRD_GDS0_DBSL'])[1,:,:]
    # u = np.deg2rad(u)
    v = np.array(nc.variables['VOGRD_GDS0_DBSL'])[1,:,:]
    # v = np.deg2rad(v)
    Pour 0, 1,2, et 3, mais l'image est la même à chaque fois. Comment déterminer dans ce cas?
    Nom : Figure 1_2.jpg
Affichages : 176
Taille : 100,4 Ko

    Et sans vouloir abuser de ton temps, quelle variable faut-il manipuler pour faire pivoter les flèches? Je doute que tous les courants aillent dans le même sens..

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Si ça marche pour lat et lon, on peut penser que le problème vient du fichier de données (mais je connais pas la bibliothèque netCDF4). Imprime les premières valeurs pour voir si tu les retrouves :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print(uin[0,:10,:10])
    print(uin[0,:10,:10])
    ...
    Tu peux voir si l'image est correcte en zoomant ou en affichant une sélection. Compare au fichier de données.

    quelle variable faut-il manipuler pour faire pivoter les flèches?
    Ben, l'orientation des flèches est données par les tableaux uin et vin. Au point (i,j), la composant suivant X de la flèche est uin[i,j] et celle suivant Y est vin[i,j].

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    les valeurs coïncident, seule erreur était le nombre trop important d'indices pour les variables, j'ai mis print(u[:10,:10]) à la place, sachant que u renvoie trois dimensions, est-ce normal?

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Si j'exécute ce code (array commentés) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    import netCDF4
    from netCDF4 import Dataset
    import datetime as dt
    import numpy as np
    import numpy.ma as ma
    from datetime import date, datetime, timedelta
    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
     
     
    nc=Dataset('datasets/Med.nc')
     
    lat = nc.variables['g0_lat_1']
    lat = np.array(lat)
    lat = lat[:1]
     
    lon = nc.variables['g0_lon_2']
    lon = np.array(lon)
    lon = lon[:1]
     
    u = nc.variables['UOGRD_GDS0_DBSL']
    # u = np.array(u)
    u = u[1, :]
    v = nc.variables['VOGRD_GDS0_DBSL']
    # v = np.array(v)
    v = v[1, :]
     
     
    m = Basemap(llcrnrlon = -15,llcrnrlat = 28,
    			urcrnrlon = 42,urcrnrlat = 48,
    			projection='merc',resolution ='l')
     
     
    # Calculate positions of vectors on map projection 
    y, x = np.meshgrid(lat,lon)
     
    # Calculate the orientation of the vectors
    x1, y1 = m(lon+u, lat+v)
    u_map, v_map = x1-x, y1-y
     
    # Rescale the magnitudes of the vectors...
    mag_scale = np.hypot(u_map, v_map) / np.hypot(u, v)
    u_map /= mag_scale
    v_map /= mag_scale
     
    m.quiver(x, y, u_map, v_map)
    plt.show()
    J'obtiens cette image :
    Nom : Figure 1_4.jpg
Affichages : 191
Taille : 7,6 Ko

    Tandis que si je décommente l'array, j'obtiens ça :
    Nom : Figure 1_5.jpg
Affichages : 199
Taille : 8,5 Ko

Discussions similaires

  1. Créer des boutons aux formes des pays sur une carte
    Par bernards111 dans le forum Flash
    Réponses: 9
    Dernier message: 12/04/2010, 12h19
  2. insert des données sur une autre table
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 18/02/2009, 16h21
  3. envoyer des données sur une carte son
    Par khalifa1 dans le forum DirectX
    Réponses: 1
    Dernier message: 26/10/2007, 18h29
  4. Faire des effets sur une carte (coloration de zones)
    Par breizhgen dans le forum Webdesign & Ergonomie
    Réponses: 9
    Dernier message: 12/03/2007, 17h07
  5. Réponses: 4
    Dernier message: 18/04/2006, 23h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo