Trazando un mapa de calor 2D con Matplotlib

Usando Matplotlib, quiero trazar un mapa de calor 2D. Mis datos son una matriz numpy n-por-n, cada una con un valor entre 0 y 1. Así que para el elemento (i, j) de esta matriz, quiero trazar un cuadrado en la coordenada (i, j) en mi mapa de calor, cuyo color es proporcional al valor del elemento en la matriz.

¿Cómo puedo hacer esto?

La función imshow() con parámetros interpolation='nearest' y cmap='hot' debe hacer lo que quieras.

 import matplotlib.pyplot as plt import numpy as np a = np.random.random((16, 16)) plt.imshow(a, cmap='hot', interpolation='nearest') plt.show() 

introduzca la descripción de la imagen aquí

Respondiendo aquí bastante tarde, pero de todos modos … Seaborn se encarga de gran parte del trabajo manual y traza automáticamente un gradiente al lado de la tabla, etc.

p.ej

 import numpy as np import seaborn as sns import matplotlib.pylab as plt uniform_data = np.random.rand(10, 12) ax = sns.heatmap(uniform_data, linewidth=0.5) plt.show() 

introduzca la descripción de la imagen aquí O incluso puede trazar triangularjs superior / inferior izquierda / derecha de matrices cuadradas, por ejemplo, una matriz de correlación que es cuadrada y simétrica, por lo que trazar todos los valores sería redundante de todos modos.

 corr = np.corrcoef(np.random.randn(10, 200)) mask = np.zeros_like(corr) mask[np.triu_indices_from(mask)] = True with sns.axes_style("white"): ax = sns.heatmap(corr, mask=mask, vmax=.3, square=True, cmap="YlGnBu") plt.show() 

introduzca la descripción de la imagen aquí

¡Espero que ayude!

Aquí está cómo hacerlo desde un 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 xy 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 xy 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[(zizmax)] = None # Create the contour plot CS = plt.contourf(xi, yi, zi, 15, cmap=plt.cm.rainbow, vmax=zmax, vmin=zmin) plt.colorbar() plt.show() 

donde dat.xyz está en la forma

 x1 y1 z1 x2 y2 z2 ... 

Utilizaría la función pcolor / pcolormesh de matplotlib ya que permite un espaciado no uniforme de los datos.

Ejemplo tomado de matplotlib :

 import matplotlib.pyplot as plt import numpy as np # generate 2 2d grids for the x & y bounds y, x = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100)) z = (1 - x / 2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2) # x and y are bounds, so z should be the value *inside* those bounds. # Therefore, remove the last value from the z array. z = z[:-1, :-1] z_min, z_max = -np.abs(z).max(), np.abs(z).max() fig, ax = plt.subplots() c = ax.pcolormesh(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max) ax.set_title('pcolormesh') # set the limits of the plot to the limits of the data ax.axis([x.min(), x.max(), y.min(), y.max()]) fig.colorbar(c, ax=ax) plt.show() 

Salida del gráfico de pcolormesh