web-dev-qa-db-fra.com

Comment tracer une carte de densité en python?

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:

enter image description here

Maintenant, j'aimerais avoir le même résultat avec matplotlib.

21
user3722235

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:

Resulting image

19
Andi

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

enter image description here

Si les données ressemblent à votre échantillon, numpy peut les charger à l'aide de la commande numpy.genfromtext .

11
Hooked