Matplotlib을 사용하여 2D 히트 맵 플로팅


139

Matplotlib을 사용하여 2D 히트 맵을 플롯하려고합니다. 내 데이터는 각각 0과 1 사이의 값을 가진 nxn Numpy 배열입니다. 따라서이 배열의 (i, j) 요소의 경우 내 (i, j) 좌표에서 사각형을 그리려고합니다 히트 맵-색상이 배열의 요소 값에 비례합니다.

어떻게해야합니까?


2
당신은 볼 않았다 matplotlib갤러리 게시하기 전에 전혀? 이 사용하는 좋은 예입니다 imshow, pcolor그리고 pcolormesh당신이 원하는 것을 할 그
tmdavison

답변:


188

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

여기에 이미지 설명을 입력하십시오


1
보간을 지정해야한다고 생각하지 않습니다.
miguel.martin

2
pyplot의 문서에 따라 @ miguel.martin : "보간이 없음 (기본값) 인 경우 기본값은 rc image.interpolation"입니다. 그래서 그것을 포함해야한다고 생각합니다.
P. Camilleri

@ P.Camilleri X 축과 Y 축을 스케일하는 방법은 무엇입니까? 확대 / 축소하지 않고 숫자 만 변경하십시오.
Dole

64

Seaborn 은 많은 수작업을 처리하고 차트 등에서 자동으로 그라디언트를 그립니다.

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

여기에 이미지 설명을 입력하십시오

또는 정사각형이고 대칭 인 상관 행렬과 같이 정사각 행렬의 상하 좌우 삼각형을 플로팅하여 모든 값을 플로팅하는 것은 어쨌든 중복됩니다.

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

여기에 이미지 설명을 입력하십시오


1
나는 플롯 유형을 매우 좋아하며 반 행렬이 유용합니다. 두 가지 질문 : 1) 첫 번째 줄거리에서 작은 사각형은 흰색 선으로 분리되어 있습니다. 2) 흰색 선 너비가 변하는 것 같습니다. 이것이 인공물입니까?
P. Camilleri

1
다른 플롯 (예 : 두 번째 플롯)의 첫 번째 플롯에 사용 된 'linewidth'인수를 사용하여 정사각형을 얻을 수 있습니다. 선폭은 스크린 샷 문제로 인해 첫 번째 플롯에서만 변하는 것으로 보이며 실제로 실제로 변하지는 않으며 설정 한 상수를 유지해야합니다.
PyRsquared

이것이 사실이지만-seaborn을 사용한 응답이 matplotlib을 구체적으로 언급하는 질문에 대해 전체적으로 간주되어야한다고 생각하지 않습니다.
baxx

28

2D numpy배열의 경우 간단히 사용 imshow()하면 도움이 될 수 있습니다.

import matplotlib.pyplot as plt
import numpy as np


def heatmap2d(arr: np.ndarray):
    plt.imshow(arr, cmap='viridis')
    plt.colorbar()
    plt.show()


test_array = np.arange(100 * 100).reshape(100, 100)
heatmap2d(test_array)

예제 코드의 히트 맵

이 코드는 연속 히트 맵을 생성합니다.

당신은 다른 내장 선택할 수 있습니다 colormap에서 여기 .


18

matplotlib의 pcolor / pcolormesh 함수는 데이터의 균일하지 않은 간격을 허용하기 때문에 사용합니다.

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

pcolormesh 플롯 출력


12

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
...

1
단지 짧은 헤드 업 : 0..1
Maikefer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.