2015-10-22 23 views
31

Utilizzando Matplotlib, desidero stampare una mappa di calore 2D. I miei dati sono un array Numpy n-by-n, ognuno con un valore compreso tra 0 e 1. Quindi per l'elemento (i, j) di questo array, voglio tracciare un quadrato alle coordinate (i, j) nel mio mappa termica, il cui colore è proporzionale al valore dell'elemento nell'array.Creazione di una mappa termica 2D con Matplotlib

Come posso fare questo?

+6

Eventuali duplicati di [tracciare una matrice 2D in Python , codice e visualizzazione più utile] (http://stackoverflow.com/questions/5552641/plotting-a-2d -matrix-in-python-codice-e-più-utile-visualizzazione). Inoltre, Google avrebbe aiutato qui. Hai controllato l'esteso matplotlib [esempi] (http://matplotlib.org/examples/index.html) e [gallery] (http://matplotlib.org/gallery.html)? –

+2

hai visto la [matplotlib' gallery] (http://matplotlib.org/gallery.html#images_contours_and_fields) prima di postare? Ci sono alcuni buoni esempi usando 'imshow',' pcolor' e 'pcolormesh' che fanno quello che vuoi – tom

+0

Possibile duplicato di [multi color Heat error error Python] (http://stackoverflow.com/questions/30068049/multi-colored -heat-map-error-python) – jkalden

risposta

73

La funzione imshow() con i parametri interpolation='nearest' e cmap='hot' dovrebbe fare ciò che si desidera.

import matplotlib.pyplot as plt 
import numpy as np 

a = np.random.random((16, 16)) 
plt.imshow(a, cmap='hot', interpolation='nearest') 
plt.show() 

enter image description here

+0

Non credo che sia necessario specificare l'interpolazione. –

+2

@ miguel.martin come da documento di pyplot: "Se l'interpolazione è None (il suo valore predefinito), default su rc image.interpolation". Quindi penso che sia necessario includerlo. –

7

Ecco come farlo da un file CSV:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.interpolate import griddata 

# Load data from CSV 
dat = np.genfromtxt('dat.xyz', delimiter=' ',skip_header=0) 
X_dat = dat[:,0] 
Y_dat = dat[:,1] 
Z_dat = dat[:,2] 

# Convert from pandas dataframes to numpy arrays 
X, Y, Z, = np.array([]), np.array([]), np.array([]) 
for i in range(len(X_dat)): 
     X = np.append(X,X_dat[i]) 
     Y = np.append(Y,Y_dat[i]) 
     Z = np.append(Z,Z_dat[i]) 

# create x-y points to be used in heatmap 
xi = np.linspace(X.min(),X.max(),1000) 
yi = np.linspace(Y.min(),Y.max(),1000) 

# Z is a matrix of x-y values 
zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='cubic') 

# I control the range of my colorbar by removing data 
# outside of my range of interest 
zmin = 3 
zmax = 12 
zi[(zi<zmin) | (zi>zmax)] = None 

# Create the contour plot 
CS = plt.contourf(xi, yi, zi, 15, cmap=plt.cm.rainbow, 
        vmax=zmax, vmin=zmin) 
plt.colorbar() 
plt.show() 

dove dat.xyz è in forma

x1 y1 z1 
x2 y2 z2 
... 
+0

Sei sicuro di non avere molte righe di commento nel tuo script;) –

+1

@ tommy.carstensen Ho aggiunto commenti per te. – kilojoules

+1

Grazie mille! –

Problemi correlati