Matplotlib 的填充区域与透明度

PythonPythonBeginner
立即练习

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

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

简介

在数据可视化中,有时需要突出显示图表上的某些区域或范围。Matplotlib 的 fill_between 函数是用于在最小边界和最大边界之间生成阴影区域的有用工具。它还可用于增强图表的视觉外观。alpha 参数可用于调整阴影区域的透明度。本实验将指导你完成在 Matplotlib 中使用 fill_betweenalpha 的几个示例,以创建更具视觉吸引力和信息丰富的图表。

虚拟机使用提示

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

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

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

使用 fill_between 增强折线图

第一个示例展示了如何使用 fill_between 增强折线图。我们将使用来自谷歌的金融数据创建两个子图,一个是简单的折线图,另一个是填充的折线图。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook

## 加载一些示例金融数据
r = cbook.get_sample_data('goog.npz')['price_data'].view(np.recarray)

## 创建两个共享 x 轴和 y 轴的子图
fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)

pricemin = r.close.min()

ax1.plot(r.date, r.close, lw=2)
ax2.fill_between(r.date, pricemin, r.close, alpha=0.7)

for ax in ax1, ax2:
    ax.grid(True)
    ax.label_outer()

ax1.set_ylabel('price')
fig.suptitle('Google (GOOG) daily closing price')
fig.autofmt_xdate()

使用 alpha 淡化颜色

alpha 参数还可用于淡化颜色,以创建更具视觉吸引力的图表。在以下示例中,我们将计算两组随机游走者,它们的步长取自具有不同均值和标准差的正态分布。我们使用填充区域来绘制总体平均位置的正负一个标准差。

## 固定随机状态以确保可重复性
np.random.seed(19680801)

Nsteps, Nwalkers = 100, 250
t = np.arange(Nsteps)

## 一个 (Nsteps x Nwalkers) 的随机游走步长数组
S1 = 0.004 + 0.02*np.random.randn(Nsteps, Nwalkers)
S2 = 0.002 + 0.01*np.random.randn(Nsteps, Nwalkers)

## 一个 (Nsteps x Nwalkers) 的随机游走者位置数组
X1 = S1.cumsum(axis=0)
X2 = S2.cumsum(axis=0)

## 长度为 Nsteps 的数组,分别表示两个总体随时间的经验均值和标准差
mu1 = X1.mean(axis=1)
sigma1 = X1.std(axis=1)
mu2 = X2.mean(axis=1)
sigma2 = X2.std(axis=1)

## 绘制图表!
fig, ax = plt.subplots(1)
ax.plot(t, mu1, lw=2, label='mean population 1')
ax.plot(t, mu2, lw=2, label='mean population 2')
ax.fill_between(t, mu1+sigma1, mu1-sigma1, facecolor='C0', alpha=0.4)
ax.fill_between(t, mu2+sigma2, mu2-sigma2, facecolor='C1', alpha=0.4)
ax.set_title(r'random walkers empirical $\mu$ and $\pm \sigma$ interval')
ax.legend(loc='upper left')
ax.set_xlabel('num steps')
ax.set_ylabel('position')
ax.grid()

使用 where 突出显示特定区域

where 关键字参数对于突出显示图表的特定区域非常方便。where 接受一个与 x、ymin 和 ymax 参数长度相同的布尔掩码,并且只填充布尔掩码为 True 的区域。在下面的示例中,我们模拟了一个随机游走者,并计算了总体位置的解析均值和标准差。总体均值显示为虚线,均值的正负一个标准差偏差显示为填充区域。我们使用 where 掩码 X > upper_bound 来找到游走者超出一个标准差边界的区域,并将该区域涂成红色。

## 固定随机状态以确保可重复性
np.random.seed(1)

Nsteps = 500
t = np.arange(Nsteps)

mu = 0.002
sigma = 0.01

## 步长和位置
S = mu + sigma*np.random.randn(Nsteps)
X = S.cumsum()

## 解析的总体一个标准差上下界
lower_bound = mu*t - sigma*np.sqrt(t)
upper_bound = mu*t + sigma*np.sqrt(t)

fig, ax = plt.subplots(1)
ax.plot(t, X, lw=2, label='walker position')
ax.plot(t, mu*t, lw=1, label='population mean', color='C0', ls='--')
ax.fill_between(t, lower_bound, upper_bound, facecolor='C0', alpha=0.4,
                label='1 sigma range')
ax.legend(loc='upper left')

## 在这里,我们使用 where 参数只填充游走者高于总体一个标准差边界的区域
ax.fill_between(t, upper_bound, X, where=X > upper_bound, fc='red', alpha=0.4)
ax.fill_between(t, lower_bound, X, where=X < lower_bound, fc='red', alpha=0.4)
ax.set_xlabel('num steps')
ax.set_ylabel('position')
ax.grid()

使用 axhspanaxvspan 突出显示坐标轴的跨度

填充区域的另一个方便用途是突出显示坐标轴的水平或垂直跨度。为此,Matplotlib 提供了辅助函数 axhspanaxvspan。有关更多信息,请参阅 axhspan_demo 示例库。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5)
ax.axvspan(6, 7, facecolor='r', alpha=0.5)

plt.show()

总结

在本实验中,我们学习了如何使用 Matplotlib 中的 fill_between 函数和 alpha 参数来创建更具视觉吸引力和信息丰富的图表。我们展示了几个使用 fill_betweenalpha 突出显示图表特定区域或范围的示例。我们还简要介绍了用于突出显示坐标轴跨度的 axhspanaxvspan 函数。