Zeichnen einer 2D-Heatmap

Lesezeit: 4 Minuten

Benutzeravatar von Karnivaurus
Karnivaurus

Mit Matplotlib möchte ich eine 2D-Heatmap zeichnen. Meine Daten sind ein n-mal-n-Numpy-Array mit jeweils einem Wert zwischen 0 und 1. Also 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?

Benutzeravatar von P. Camilleri
S. Camilleri

Das imshow() Funktion mit Parametern interpolation='nearest' und cmap='hot' soll machen was du willst.

Bitte überprüfen Sie die interpolation Parameterdetails, und siehe Interpolationen für imshow und Bild-Antialiasing.

import matplotlib.pyplot as plt
import numpy as np

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

Eine durch den Beispielcode erzeugte Beispielfarbkarte

Benutzeravatar von PyRsquared
PyRQuadrat

Seegeboren ist eine High-Level-API für Matplotlib, die einen Großteil der manuellen Arbeit übernimmt.

seaborn.heatmap zeichnet automatisch einen Gradienten an der Seite des Diagramms 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()

Geben Sie hier die Bildbeschreibung ein

Sie können sogar obere / untere linke / rechte Dreiecke von quadratischen Matrizen zeichnen. Beispielsweise ist eine Korrelationsmatrix quadratisch und symmetrisch, sodass das Zeichnen aller Werte ü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()

Geben Sie hier die Bildbeschreibung ein

Ich würde Matplotlibs verwenden pfarbe/pcolormesh Funktion, da sie einen ungleichmäßigen Abstand der Daten zulässt.

Beispiel entnommen 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-Ausgabe

Für eine 2d numpy Array, einfach verwenden imshow() kann dir helfen:

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)

Die Heatmap des Beispielcodes

Dieser Code erzeugt eine kontinuierliche Heatmap.

Sie können einen anderen integrierten auswählen colormap aus hier.

Benutzeravatar von kilojoules
Kilojoule

So geht’s aus einer CSV-Datei:

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)

# Interpolate for plotting
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()

wo dat.xyz ist im Formular

x1 y1 z1
x2 y2 z2
...

Benutzeravatar von mamaj
Mamaj

Verwenden matshow() das ist ein Wrapper herum imshow nützliche Standardeinstellungen für die Anzeige einer Matrix festzulegen.

a = np.diag(range(15))
plt.matshow(a)

Geben Sie hier die Bildbeschreibung ein

https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.matshow.html

Dies ist nur eine praktische Funktion, die imshow umschließt, um nützliche Standardwerte für die Anzeige einer Matrix festzulegen. Im Speziellen:

  • Satz origin='upper'.
  • Satz interpolation='nearest'.
  • Satz aspect="equal".
  • Häkchen werden links und oben gesetzt.
  • Ticks sind so formatiert, dass sie ganzzahlige Indizes anzeigen.

1430470cookie-checkZeichnen einer 2D-Heatmap

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy