it-swarm.com.de

Zeichnen einer 2D-Heatmap mit Matplotlib

Mit Matplotlib möchte ich eine 2D-Heatmap zeichnen. Meine Daten sind ein n-mal-n-Numpy-Array mit einem Wert zwischen 0 und 1. Daher möchte ich für das (i, j) -Element dieses Arrays ein Quadrat an der (i, j) -Koordinate in my zeichnen Heatmap, deren Farbe proportional zum Wert des Elements im Array ist.

Wie kann ich das machen?

91
Karnivaurus

Die Funktion imshow() mit den Parametern interpolation='nearest' und cmap='hot' sollte tun, was Sie wollen.

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

145
P. Camilleri

Seaborn erledigt einen Großteil der manuellen Arbeit und zeichnet automatisch einen Verlauf an der Seite der Karte usw.

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

Sie können auch obere/untere linke/rechte Dreiecke von quadratischen Matrizen zeichnen, z. B. eine Korrelationsmatrix, die quadratisch und symmetrisch ist, sodass das Zeichnen aller Werte sowieso überflüssig wäre.

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

38
PyRsquared

So geht's aus einer 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()

wobei dat.xyz in der Form ist

x1 y1 z1
x2 y2 z2
...
12
kilojoules

Ich würde die Funktion pcolor / pcolormesh von matplotlib verwenden, da sie einen ungleichmäßigen Abstand der Daten zulässt.

Beispiel aus 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 plot output

9

Verwenden Sie für ein 2d numpy Array einfach imshow(), um Folgendes zu erreichen:

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)

The heatmap of the example code

Dieser Code erzeugt eine fortlaufende Heatmap.

Sie können aus hier ein anderes eingebautes colormap auswählen.

5
Huang Yuheng