2015-10-22 4 views
31

Используя Matplotlib, я хочу построить двумерную карту тепла. Мои данные представляют собой массив n-by-n Numpy, каждый из которых имеет значение от 0 до 1. Итак, для элемента (i, j) этого массива я хочу построить квадрат в координате (i, j) в моей тепловая карта, цвет которой пропорционален значению элемента в массиве.Построение 2D-карты тепла с помощью Matplotlib

Как я могу это сделать?

+6

Возможный дубликат [черчения матрицу 2D в питона , код и наиболее полезная визуализация] (http://stackoverflow.com/questions/5552641/plotting-a-2d -матрица-в-питон-код-и-большинство-полезную визуализацию). Кроме того, Google помог бы здесь. Вы проверили обширный matplotlib [примеры] (http://matplotlib.org/examples/index.html) и [галерея] (http://matplotlib.org/gallery.html)? –

+2

Вы вообще не просматривали ['matplotlib' gallery] (http://matplotlib.org/gallery.html#images_contours_and_fields) перед публикацией? Есть несколько хороших примеров использования 'imshow',' pcolor' и 'pcolormesh', которые делают то, что вы хотите – tom

+0

Возможный дубликат [многоцветной ошибки тепловой карты Python] (http://stackoverflow.com/questions/30068049/multi-colored -heat-map-error-python) – jkalden

ответ

73

Функция imshow() с параметрами interpolation='nearest' и cmap='hot' должна делать то, что вы хотите.

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

Я не думаю, что нужно указать интерполяцию. –

+2

@ miguel.martin в соответствии с документом pyplot: «Если интерполяция равна None (ее значение по умолчанию), по умолчанию используется rc image.interpolation». Поэтому я считаю необходимым включить его. –

7

Вот как это сделать из 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() 

где dat.xyz находится в форме

x1 y1 z1 
x2 y2 z2 
... 
+0

У вас наверняка нет много комментариев в вашем скрипте;) –

+1

@ tommy.carstensen Я добавил вам комментарии. – kilojoules

+1

Спасибо, миллион! –