Plotting a 2D heatmap with Matplotlib

Usando Matplotlib, quero desenhar um mapa de calor 2D. Meus dados são n-by-N Numpy array, cada um com um valor entre 0 e 1. Assim, para o elemento (i, j) deste array, eu quero traçar um quadrado na coordenada (i, j) no meu mapa de calor, cuja cor é proporcional ao valor do elemento no array.

Como posso fazer isto?

Author: Karnivaurus, 2015-10-22

3 answers

A imshow() a função com os parâmetros interpolation='nearest' e cmap='hot' deve fazer o que quiser.

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

 99
Author: P. Camilleri, 2017-12-06 21:13:22
A responder aqui muito tarde, mas de qualquer forma... Seaborn cuida de muito do trabalho manual e traça automaticamente um gradiente ao lado da carta, etc.

Por exemplo

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

enter image description here Ou, você pode até mesmo desenhar triângulos superior / inferior esquerdo / direito de matrizes quadradas, por exemplo uma matriz de correlação que é quadrada e simétrica, então traçar todos os valores seria redundante de qualquer maneira.

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

enter image description here

Espero que isso ajude!
 11
Author: killerT2333, 2018-04-02 09:27:08
Aqui está como fazê-lo a partir de um 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()

Em que dat.xyz está na forma

x1 y1 z1
x2 y2 z2
...
 9
Author: kilojoules, 2016-11-06 21:35:20