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

WBOY
Libérer: 2024-02-12 22:27:03
avant
755 Les gens l'ont consulté

如何使用 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
Copier après la connexion

J'utilise la commande

plt.contourf(dens.density.values[-1,:,:]);
Copier après la connexion

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');
Copier après la connexion

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,:,:]);
Copier après la connexion

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'
Copier après la connexion

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
Copier après la connexion

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()
Copier après la connexion

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()
Copier après la connexion

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)
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal