2D 画像で透明度と色をブレンドする#

透明度と色をブレンドして、imshow でデータの一部を強調表示します。

の一般的な用途matplotlib.pyplot.imshowは、2D 統計マップをプロットすることです。この関数を使用すると、2D マトリックスをイメージとして簡単に視覚化し、出力に透明度を追加できます。たとえば、統計 (t 統計など) をプロットし、p 値に従って各ピクセルの透明度に色を付けることができます。この例は、この効果を実現する方法を示しています。

最初にいくつかのデータを生成します。この場合、2D グリッドに 2 つの 2D "blob" を作成します。一方のブロブは陽性で、もう一方は陰性です。

import numpy as np
import matplotlib.pyplot as plt
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()
画像の透明度のブレンド

透明度のブレンド#

データをプロットするときに透明度を含める最も簡単な方法 matplotlib.pyplot.imshowは、データの形状に一致する配列をalpha引数に渡すことです。たとえば、下に左から右に移動するグラデーションを作成します。

# 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()
画像の透明度のブレンド

透明度を使用して振幅の大きい値を強調表示する#

最後に、同じプロットを再作成しますが、今回は透明度を使用してデータの極端な値を強調します。これは、小さい p 値を持つデータ ポイントを強調表示するためによく使用されます。また、等高線を追加して、画像の値を強調します。

# 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()
画像の透明度のブレンド

参考文献

この例では、次の関数、メソッド、クラス、およびモジュールの使用が示されています。

Sphinx-Gallery によって生成されたギャラリー