Transparenz mit Farbe in 2D-Bildern mischen#

Mischen Sie Transparenz mit Farbe, um Teile von Daten mit imshow hervorzuheben.

Eine häufige Anwendung für matplotlib.pyplot.imshow ist das Plotten einer 2D-Statistikkarte. Die Funktion erleichtert die Visualisierung einer 2D-Matrix als Bild und das Hinzufügen von Transparenz zur Ausgabe. Zum Beispiel kann man eine Statistik (wie einen t-Wert) plotten und die Transparenz jedes Pixels entsprechend seines p-Werts färben. Dieses Beispiel zeigt, wie Sie diesen Effekt erzielen können.

Zuerst generieren wir einige Daten, in diesem Fall erstellen wir zwei 2D-"Blobs" in einem 2D-Gitter. Ein Blob wird positiv und der andere negativ sein.

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.colors import Normalize


def normal_pdf(x, mean, var):
    return np.exp(-(x - mean)**2 / (2*var))


# Generate the space in which the blobs will live
xmin, xmax, ymin, ymax = (0, 100, 0, 100)
n_bins = 100
xx = np.linspace(xmin, xmax, n_bins)
yy = np.linspace(ymin, ymax, n_bins)

# Generate the blobs. The range of the values is roughly -.0002 to .0002
means_high = [20, 50]
means_low = [50, 60]
var = [150, 200]

gauss_x_high = normal_pdf(xx, means_high[0], var[0])
gauss_y_high = normal_pdf(yy, means_high[1], var[0])

gauss_x_low = normal_pdf(xx, means_low[0], var[1])
gauss_y_low = normal_pdf(yy, means_low[1], var[1])

weights = (np.outer(gauss_y_high, gauss_x_high)
           - np.outer(gauss_y_low, gauss_x_low))

# We'll also create a grey background into which the pixels will fade
greys = np.full((*weights.shape, 3), 70, dtype=np.uint8)

# First we'll plot these blobs using ``imshow`` without transparency.
vmax = np.abs(weights).max()
imshow_kwargs = {
    'vmax': vmax,
    'vmin': -vmax,
    'cmap': 'RdYlBu',
    'extent': (xmin, xmax, ymin, ymax),
}

fig, ax = plt.subplots()
ax.imshow(greys)
ax.imshow(weights, **imshow_kwargs)
ax.set_axis_off()
image transparency blend

Transparenz beimischen#

Der einfachste Weg, Transparenz beim Plotten von Daten mit matplotlib.pyplot.imshow einzuschließen, besteht darin, ein Array mit der Form der Daten an das Argument alpha zu übergeben. Wir erstellen beispielsweise unten einen Gradienten, der von links nach rechts verläuft.

# Create an alpha channel of linearly increasing values moving to the right.
alphas = np.ones(weights.shape)
alphas[:, 30:] = np.linspace(1, 0, 70)

# Create the figure and image
# Note that the absolute values may be slightly different
fig, ax = plt.subplots()
ax.imshow(greys)
ax.imshow(weights, alpha=alphas, **imshow_kwargs)
ax.set_axis_off()
image transparency blend

Verwendung von Transparenz zur Hervorhebung von Werten mit hoher Amplitude#

Schließlich werden wir denselben Plot rekonstruieren, aber diesmal werden wir Transparenz verwenden, um die extremen Werte in den Daten hervorzuheben. Dies wird oft verwendet, um Datenpunkte mit kleineren p-Werten hervorzuheben. Wir werden auch Konturlinien hinzufügen, um die Bildwerte hervorzuheben.

# Create an alpha channel based on weight values
# Any value whose absolute value is > .0001 will have zero transparency
alphas = Normalize(0, .3, clip=True)(np.abs(weights))
alphas = np.clip(alphas, .4, 1)  # alpha value clipped at the bottom at .4

# Create the figure and image
# Note that the absolute values may be slightly different
fig, ax = plt.subplots()
ax.imshow(greys)
ax.imshow(weights, alpha=alphas, **imshow_kwargs)

# Add contour lines to further highlight different levels.
ax.contour(weights[::-1], levels=[-.1, .1], colors='k', linestyles='-')
ax.set_axis_off()
plt.show()

ax.contour(weights[::-1], levels=[-.0001, .0001], colors='k', linestyles='-')
ax.set_axis_off()
plt.show()
image transparency blend

Referenzen

Die Verwendung der folgenden Funktionen, Methoden, Klassen und Module wird in diesem Beispiel gezeigt

Gesamtlaufzeit des Skripts: (0 Minuten 1,636 Sekunden)

Galerie generiert von Sphinx-Gallery