Maison  >  Article  >  développement back-end  >  Comment tracer un tableau de densité à l'aide de matplotlib.pyplot.contourf

Comment tracer un tableau de densité à l'aide de matplotlib.pyplot.contourf

WBOY
WBOYavant
2024-02-12 22:27:03755parcourir

如何使用 matplotlib.pyplot.contourf 绘制密度数组

Contenu de la question

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


Réponse correcte


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

Dernière édition

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer