J'ai un fichier .txt contenant les valeurs x, y de points régulièrement espacés dans une carte 2D, la 3e coordonnée étant la densité à ce point.
4.882812500000000E-004 4.882812500000000E-004 0.9072267
1.464843750000000E-003 4.882812500000000E-004 1.405174
2.441406250000000E-003 4.882812500000000E-004 24.32851
3.417968750000000E-003 4.882812500000000E-004 101.4136
4.394531250000000E-003 4.882812500000000E-004 199.1388
5.371093750000000E-003 4.882812500000000E-004 1278.898
6.347656250000000E-003 4.882812500000000E-004 1636.955
7.324218750000000E-003 4.882812500000000E-004 1504.590
8.300781250000000E-003 4.882812500000000E-004 814.6337
9.277343750000000E-003 4.882812500000000E-004 273.8610
Lorsque je trace cette carte de densité dans gnuplot, avec les commandes suivantes:
set palette rgbformulae 34,35,0
set size square
set pm3d map
splot "dens_map.map" u 1:2:(log10($3+10.)) title "Density map"`
Ce qui me donne cette belle image:
Maintenant, j'aimerais avoir le même résultat avec matplotlib.
Voici mon objectif d'une réponse plus complète comprenant le choix de la carte des couleurs et une normalisation logarithmique de l'axe des couleurs.
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import LogNorm
import numpy as np
x, y, z = np.loadtxt('data.txt', unpack=True)
N = int(len(z)**.5)
z = z.reshape(N, N)
plt.imshow(z+10, extent=(np.amin(x), np.amax(x), np.amin(y), np.amax(y)),
cmap=cm.hot, norm=LogNorm())
plt.colorbar()
plt.show()
Je suppose ici que vos données peuvent être transformées en un tableau 2D par une simple refonte. Si ce n'est pas le cas, vous devez travailler un peu plus pour obtenir les données sous cette forme. Utiliser imshow et non pcolormesh est plus efficace ici si vos données se trouvent sur une grille (comme cela semble le faire). L'extrait de code ci-dessus donne l'image suivante, qui se rapproche assez de ce que vous vouliez:
Le commentaire de @HYRY est bon, mais une réponse de travail minimale complète (avec une photo!) Est meilleure. En utilisant plt.pcolormesh
import pylab as plt
import numpy as np
# Sample data
side = np.linspace(-2,2,15)
X,Y = np.meshgrid(side,side)
Z = np.exp(-((X-1)**2+Y**2))
# Plot the density map using nearest-neighbor interpolation
plt.pcolormesh(X,Y,Z)
plt.show()
Si les données ressemblent à votre échantillon, numpy peut les charger à l'aide de la commande numpy.genfromtext
.