Matplotlib 图像透明度

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验将向你展示如何使用Matplotlib在二维图像中混合透明度与颜色。目标是通过 imshow 突出显示数据的某些部分。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向Labby提问。课程结束后提供反馈,我们将立即为你解决问题。

生成数据

我们将从在二维网格中生成两个二维斑点开始。一个斑点为正,另一个为负。

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

## 生成斑点所在的空间
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)

## 生成斑点。值的范围大致为 -0.0002 到 0.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))

## 我们还将创建一个灰色背景,像素将渐隐到其中
greys = np.full((*weights.shape, 3), 70, dtype=np.uint8)

绘制斑点

接下来,我们将使用 imshow 绘制这些斑点,不使用透明度。

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()
plt.show()

融入透明度

使用 imshow 绘制数据时,包含透明度的最简单方法是将与数据形状匹配的数组传递给 alpha 参数。

## 创建一个向右线性递增的透明度通道。
alphas = np.ones(weights.shape)
alphas[:, 30:] = np.linspace(1, 0, 70)

## 创建图形和图像
fig, ax = plt.subplots()
ax.imshow(greys)
ax.imshow(weights, alpha=alphas, **imshow_kwargs)
ax.set_axis_off()
plt.show()

使用透明度突出显示值

最后,我们将重新创建相同的绘图,但这次我们将使用透明度来突出显示数据中的极值。这通常用于突出显示p值较小的数据点。我们还将添加等高线以突出显示图像值。

## 根据权重值创建一个透明度通道
alphas = Normalize(0,.3, clip=True)(np.abs(weights))
alphas = np.clip(alphas,.4, 1)  ## 透明度值在底部裁剪为.4

## 创建图形和图像
fig, ax = plt.subplots()
ax.imshow(greys)
ax.imshow(weights, alpha=alphas, **imshow_kwargs)

## 添加等高线以进一步突出显示不同级别。
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()

总结

在这个实验中,我们学习了如何使用Matplotlib在二维图像中将透明度与颜色相融合。我们还学习了如何使用 imshow 突出显示数据的某些部分。