Matplotlib ile bir 2B ısı haritası çizme


140

Matplotlib kullanarak, 2 boyutlu bir ısı haritası çizmek istiyorum. Verilerim, her biri 0 ile 1 arasında bir değere sahip n-by-n Numpy dizisi. Bu nedenle, bu dizinin (i, j) elemanı için, benim (i, j) koordinatımda bir kare çizmek istiyorum. rengi dizideki öğenin değeriyle orantılı olan ısı haritası.

Bunu nasıl yapabilirim?


2
Eğer baktın matplotlibgalerinin göndermeden önce hiç? Orada kullanarak bazı iyi örneklerdir imshow, pcolorve pcolormeshne istediğinizi yapmak
tmdavison

Yanıtlar:


190

imshow()Parametrelerle işlevi interpolation='nearest've cmap='hot'ne istediğinizi yapmalıdır.

import matplotlib.pyplot as plt
import numpy as np

a = np.random.random((16, 16))
plt.imshow(a, cmap='hot', interpolation='nearest')
plt.show()

görüntü açıklamasını buraya girin


1
Enterpolasyon belirtmenin gerekli olduğunu sanmıyorum.
miguel.martin

2
@ miguel.martin, pyplot'un belgesine göre: "Enterpolasyon Yok ise (varsayılan değeri), rc image.interpolation için varsayılan değerdir". Bu yüzden onu dahil etmenin gerekli olduğunu düşünüyorum.
P. Camilleri

@ P.Camilleri X ve Y eksenleri nasıl ölçeklendirilir? (Yalnızca sayıları değiştirin, yakınlaştırma yok).
Dole

65

Seaborn , birçok manuel işi halleder ve grafiğin yan tarafına otomatik olarak bir eğim çizer .

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

görüntü açıklamasını buraya girin

Ya da kare matrislerin üst / alt sol / sağ üçgenlerini, örneğin kare olan ve simetrik olan bir korelasyon matrisini bile çizebilirsiniz, böylece tüm değerleri çizmek yine de gereksiz olacaktır.

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

görüntü açıklamasını buraya girin


1
Çizim tipini çok seviyorum ve yarım matris kullanışlıdır. İki soru: 1) ilk arsada küçük kareler beyaz çizgilerle ayrılıyor, birleşim olabilir mi? 2) beyaz çizgi genişliği değişiyor gibi görünüyor, bu bir artefakt mı?
P. Camilleri

1
İlk grafikte kullandığım 'linewidth' argümanını başka herhangi bir grafik için (örneğin ikinci grafikte) aralıklı kareler elde etmek için kullanabilirsiniz. Çizgi genişlikleri yalnızca ekran görüntüsü sorunları nedeniyle ilk planda değişiyor gibi görünüyor, gerçekte değişmiyorlar, ayarladığınız sabit kalmaları gerekiyor.
PyRsquared

bu doğru olsa da - seaborn kullanan bir yanıtın özellikle matplotlib'i belirten bir soru için tam olarak değerlendirilmesi gerektiğini düşünmüyorum.
baxx

28

2 boyutlu bir numpydizi için şunu kullanmanız imshow()size yardımcı olabilir:

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)

Örnek kodun ısı haritası

Bu kod, sürekli bir ısı haritası oluşturur.

Başka bir dahili seçebilir colormapdan burada .


18

Ben Matplotlib en kullanmak pcolor / pcolormesh verinin eşit olmayan aralık olanak sağladığı bir işlev.

Matplotlib'den alınan örnek :

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 grafik çıktısı


12

Bunu bir csv'den şu şekilde yapabilirsiniz:

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

x1 y1 z1
x2 y2 z2
...

1
Kısa bir
uyarı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.