Basemap et pcolormesh avec des DataFrames

Signaler
Messages postés
4
Date d'inscription
lundi 14 juin 2021
Statut
Membre
Dernière intervention
13 août 2021
-
Bonjour,

Je débute avec pandas et je ne trouve pas comment utiliser pcolormesh avec des dataframes.
En effet j'aimerais créer une animation montrant l'évolution de certaines données telles que la salinité et la température autour de l'Islande. (Et plus tard l'évolution de masses d'eaux)
Mes données se présentent sous la forme suivante.



Je pense que le problème vient du fait que les données sont sous forme de colonnes et non de tableaux, j'ai essayé avec un groupby(['x']) mais cela ne fonctionne pas.

Voilà mon code :
 
import xarray as xr
import pandas as pd
import os
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.animation as animation
import time
import datetime
import mpl_toolkits
from mpl_toolkits.basemap import Basemap
import matplotlib.patches as mpatches
import warnings
warnings.filterwarnings('ignore')
m = Basemap(projection = 'merc',
            llcrnrlat = 60,
            urcrnrlat = 70,
            llcrnrlon =-30,
            urcrnrlon = -10,
            lat_ts = 20,
            resolution = 'f')
fig = plt.figure(figsize=(40,15))
ann = ann = plt.text(0.1,0.1,'Water masses')
bla_patch = mpatches.Patch(color='black', label='Unknown')
blu_patch = mpatches.Patch(color='blue', label='AW')
r_patch = mpatches.Patch(color='red', label='NAW')
g_patch = mpatches.Patch(color='green', label='CW')
c_patch = mpatches.Patch(color='cyan', label='NAW-AW')
y_patch = mpatches.Patch(color='yellow', label='CW-NAW')

def anim(i):
    global ann
    ann.remove()
    netcdf_file = '/home/lolita/Ishaf/ncdata/data_lolita/WO/topaz_V4_myocean_arctic_grid1to8_da_class1_%4i%02i15.nc' %(1991+i//12,i%12+1)
    ds = xr.open_dataset(netcdf_file)
    df = ds.to_dataframe()
    #only took salinity and temperature
    sample = df[['temperature', 'salinity','longitude','latitude']]
    sample = sample.loc[50]
    #Remove all Nan values
    sample.dropna(how = 'any', inplace = True)
    lon = sample['longitude']
    lat = sample['latitude']
    #Condition for the color of water masses
    conditionlist = [
    (sample['temperature'] < 0 ) & (sample['salinity'].between(34.3,34.8)),
    (sample['temperature'] > 3.0) & (sample['salinity'] > 35.0),
    (sample['temperature'] > 2.0) & (sample['salinity'] < 34.7),
    (sample['temperature'].between(0, 2)) & (sample['salinity'].between(34.3,34.7)),
    (sample['temperature'] > 3.0) & (sample['salinity'].between(34.3,34.7))]
    choicelist = ['blue', 'red', 'green','cyan', 'yellow' ]
    sample['Color'] = np.select(conditionlist, choicelist, default='black')
    sample = sample.groupby(['x'])
    current = ['unknown','AW', 'NAW', 'CW', 'NAW-AW', 'CW-NAW']
    xx,yy= m(lon,lat)
    #Creation of the map
    m.pcolormesh(xx,yy,color = sample['temperature'],cmap= 'jet',shading = 'auto')
    m.drawcoastlines() 
    m.fillcontinents(color='coral')
    #plt.legend(handles=[bla_patch,blu_patch,r_patch, g_patch, c_patch, y_patch],title = "Water masses , depth = 50m")
    ann = plt.text(0.05,0.05,' %s' %sample.index[0][0].strftime('%Y-%b-%d'),fontsize=20, horizontalalignment='left', verticalalignment='bottom')
    
ani = animation.FuncAnimation(fig,anim,frames=4,interval=450, blit = False, repeat_delay=0)
ani.save('/home/lolita/Videos/water_masses_50_lolita.mp4')

plt.show()

Et l'erreur renvoyée est la suivante :

TypeError: with_transform() missing 1 required positional argument: 'data'


J'espère que c'est assez clair.
Si quelqu'un a une petite idée ou bien un lien vers un tutoriel qui pourrait m'aider car je n'ai rien trouvé pour l'instant.
J'avais déjà réussi en utilisant xarray mais c'est dans le cadre d'un stage et mon tuteur veut que j'utilise pandas.
Merci beaucoup
Bonne journée

Configuration: Linux / Firefox 89.0
A voir également: