Maison >développement back-end >Tutoriel Python >Comment tracer un tableau de densité à l'aide de matplotlib.pyplot.contourf
J'ai un ensemble de données xarray appelé dens et je souhaite le tracer.
Voici l'ensemble de données :
<xarray.dataset> dimensions: (time: 641, lat: 30, lon: 30) coordinates: * time (time) datetime64[ns] 2013-07-01t12:00:00 ... 2013-08-02t12:00:00 * lon (lon) float64 32.73 32.83 32.94 33.05 ... 35.53 35.64 35.75 35.85 * lat (lat) float64 31.08 31.27 31.47 31.66 ... 36.06 36.25 36.44 36.63 data variables: density (time, lat, lon) float64 2e+03 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0
J'utilise la commande
plt.contourf(dens.density.values[-1,:,:]);
l'a tracé et cela fonctionnait, mais comme je voulais que le littoral soit également tracé sur le terrain, j'ai aussi essayé d'utiliser
m = basemap(llcrnrlon=data['lon'].min(), llcrnrlat=data['lat'].min(), urcrnrlon=data['lon'].max(), urcrnrlat=data['lat'].max(), resolution='i', suppress_ticks=1) m.drawcoastlines(); m.fillcontinents(color='gray',lake_color='gray');
Mais quand j'exécute toutes les commandes, puis plt.show()
le tracé des contours disparaît et tout ce qu'il me montre, c'est le littoral.
Comment résoudre ce problème pour obtenir une carte de contour + une carte du littoral dans la même figure ?
Désolé si c'est une question stupide mais je suis très nouveau sur Python
Merci pour votre aide,
Yutam
Edit : Je viens de réaliser maintenant que j'essaie de combiner deux "boîtes à outils" différentes et qu'il est possible de faire tout cela en utilisant uniquement la boîte à outils du fond de carte, mais en essayant simplement d'écrire
m.contourf(dens.density.values[-1,:,:]);
me donne cette erreur :
--------------------------------------------------------------------------- typeerror traceback (most recent call last) cell in[21], line 1 ----> 1 m.contourf(dens.density.values[-1,:,:]) typeerror: basemap.contourf() missing 2 required positional arguments: 'y' and 'data'
Une autre modification : Je continue d'en découvrir davantage et après avoir lu la documentation du fond de carte, j'ai réalisé que la syntaxe de la commande devrait être comme ceci
m.contourf(dens.lon.values,dens.lat.values,dens.密度.values[-1,:,:]);
Mais maintenant, j'obtiens cette erreur :
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
Je suppose que c'est parce que mon tableau de densité est en 2D, mais comment puis-je en extraire la valeur de densité ? J'utilise [-1] dans la dimension temps car je n'ai en fait besoin que du dernier pas de temps
Merci encore d'avance, Yotam
Dernière édition
C'est l'intrigue finale, comment puis-je rendre les terres environnantes grises au lieu de violettes ? Existe-t-il également un moyen de décrire une zone géographique plus vaste, légèrement plus grande, sans gâcher les données ?
Voici les nouveaux chiffres pour mes données réelles
Le traçage à l'aide d'un fond de carte et de xarray a été discuté ici一个>.
m = basemap(llcrnrlon=data['lon'].min(), llcrnrlat=data['lat'].min(), urcrnrlon=data['lon'].max(), urcrnrlat=data['lat'].max(), resolution='i', suppress_ticks=1) m.drawcoastlines(); m.fillcontinents(color='gray',lake_color='gray') dens.density[-1,:,:].plot.contourf() plt.show()
Le code ci-dessus devrait fonctionner. J'utilise cartopy pour gérer des fonctionnalités telles que les côtes et les frontières. Vous trouverez ci-dessous un extrait de code fonctionnel pour que vous puissiez essayer d'utiliser l'ensemble de données.
import xarray as xr import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cf ds = xr.open_dataset('filename.nc') fig = plt.figure(figsize=(8,8)) crs=ccrs.platecarree() ax = fig.add_subplot(1,1,1, projection=crs) gl = ax.gridlines(crs=crs, draw_labels=true, linewidth=0.01, color='gray', alpha=0.5, linestyle='-.') ax.add_feature(cf.coastline.with_scale("50m"), lw=0.5) ax.add_feature(cf.borders.with_scale("50m"), lw=0.3) ds.density[-1,:,:].plot.contourf() plt.show()
Pour définir tous les violets (zéros) sur blanc, vous pouvez utiliser la cmap suivante.
from matplotlib.colors import LinearSegmentedColormap cm = LinearSegmentedColormap.from_list('', ['white', *plt.cm.Blues(np.arange(255))]) ds.density[-1,:,:].plot.contourf(cmap=cm)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!