简介
本实验将向你展示如何使用Matplotlib在二维图像中混合透明度与颜色。目标是通过 imshow
突出显示数据的某些部分。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问Jupyter Notebook进行练习。
有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向Labby提问。课程结束后提供反馈,我们将立即为你解决问题。
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
突出显示数据的某些部分。