Matplotlibを使用した2Dヒートマップのプロット


139

Matplotlibを使用して、2Dヒートマップをプロットします。私のデータは、n行n列のNumpy配列であり、それぞれ0から1までの値を持ちます。したがって、この配列の(i、j)要素について、私の(i、j)座標に正方形をプロットします色が配列内の要素の値に比例するヒートマップ。

これどうやってするの?


2
投稿する前にmatplotlibギャラリーを見た?そこ使用していくつかの良い例がありimshowpcolorそしてpcolormeshそれはあなたがやりたい
tmdavison

回答:


187

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 2017年

2
@ ypuel.martinは、pyplotのドキュメントに従います。「内挿がNone(そのデフォルト値)の場合、デフォルトはrc image.interpolationです。」それを含める必要があると思います。
P. Camilleri 2017年

@ P.Camilleri X軸とY軸のスケーリング方法は?(ズームのみではなく、数値のみを変更します)。
ドール

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
私はプロットタイプがとても好きで、ハーフマトリックスが役立ちます。2つの質問:1)最初のプロットでは、小さな正方形が白い線で区切られていますが、それらは結合できますか?2)白い線の幅が変化しているようですが、これはアーチファクトですか?
P. Camilleri

1
最初のプロットで他のプロット(たとえば、2番目のプロット)で使用した 'linewidth'引数を使用して、正方形の間隔を空けることができます。スクリーンショットの問題により、線幅は最初のプロットでのみ変化するように見えますが、実際には変化せず、設定した定数にとどまるはずです。
PyRsquared

これは本当ですが、matplotlibを具体的に説明する質問では、seabornを使用した応答は完全であると考えるべきではないと思います。
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の間にかなり小さい値で働いているので、キュービックはNaNを多くのもたらしたので、私は、立方晶から最も近いまたはリニアのいずれかに方法を変更する必要がありました。ただ、短いヘッドアップ
Maikefer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.