2014-06-09 15 views
17

Ho un file .txt contenente i valori x, y dei punti regolarmente distanziati in una mappa 2D, la terza coordinata è la densità in quel punto.Come tracciare una mappa della densità in python?

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 

Quando ho tracciare questa mappa densità gnuplot, con i seguenti comandi:

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"` 

Il che mi dà questa bella immagine:

enter image description here

Ora vorrei avere lo stesso risultato con matplotlib.

+1

prega [vedi qui] (http://nbviewer.ipython.org/github/jrjohansson/scientific-python -lectures/blob/master/Lecture-4-Matplotlib.ipynb # pcolor) per un esempio. Questi sono in genere chiamati "curve di livello" o "mappe di calore" in matplotlib. Anche un [esempio di overflow dello stack] (https://stackoverflow.com/questions/9008370/python-2d-contour-plot-from-3-lists-x-y-and-rho). – CoryKramer

+0

rimodellare ogni colonna in un array M x N e passarli a 'pcolormesh()'. – HYRY

risposta

18

Qui è il mio obiettivo ad una risposta più completa tra cui scegliere la mappa dei colori e una normalizzazione logaritmica dell'asse colore.

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

presumo qui che i dati possono essere trasformati in una matrice 2D da un semplice rimodellare. Se questo non è il caso, è necessario lavorare un po 'più duramente per ottenere i dati in questo modulo. Usare imshow e non pcolormesh è più efficiente qui se i dati si trovano su una griglia (come sembra). I suddetti risultati frammento di codice nella seguente immagine, che viene abbastanza vicino a quello che si voleva:

Resulting image

7

Il commento da @HYRY è buona, ma una risposta di lavoro minima completo (con una foto!) È meglio. Utilizzando 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

Se i dati si presenta come il campione, NumPy può caricare con il comando numpy.genfromtext.

+0

Grazie mille! Il problema è che meshgrid non funzionerà apparentemente perché gli array sono troppo grandi. C'è qualche alternativa a meshgrid? – user3722235

+0

@ user3722235 Meshgrid è stato semplicemente per creare i dati di esempio per la trama. Otterrai X, Y, Z dal tuo file di dati. Tuttavia, se i tuoi dati sono grandi (ad esempio più grandi della memoria), dovrai pre-elaborarli a un livello più granuloso. Non penso che questo sia il caso dato che GNUplot può già gestirlo. – Hooked

+0

Vorrei usare 'imshow' invece di' pcolormesh'. Le chiamate mesh sono più utili quando hai pixel di forma irregolare. – tacaswell

Problemi correlati