为折线图创建 3D 多边形填充

PythonPythonBeginner
立即练习

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

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

简介

在本教程中,我们将学习如何使用 Python 的 Matplotlib 库在三维图中的折线图下方创建填充空间的多边形。这些多边形将是半透明的,营造出一种“锯齿状彩色玻璃”的效果。

虚拟机使用提示

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

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

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

导入所需库

我们将首先导入必要的库。

import math
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import PolyCollection

定义折线图下方的多边形函数

接下来,我们定义一个函数 polygon_under_graph(x, y),它构建顶点列表,该列表定义了填充 (x, y) 折线图下方空间的多边形。此函数假定 x 是按升序排列的。

def polygon_under_graph(x, y):
    """
    构建顶点列表,该列表定义了填充 (x, y) 折线图下方空间的多边形。此函数假定 x 是按升序排列的。
    """
    return [(x[0], 0.), *zip(x, y), (x[-1], 0.)]

创建三维图

现在我们将使用 Matplotlib 创建一个三维图。

ax = plt.figure().add_subplot(projection='3d')

定义 x 和 lambda 数组

我们分别使用 linspacerange 函数来定义 x 和 lambda 数组。

x = np.linspace(0., 10., 31)
lambdas = range(1, 9)

计算顶点和面颜色

我们使用 Matplotlib 的 vectorizecolormaps 函数来计算顶点和面颜色。

## verts[i] 是定义多边形 i 的 (x, y) 对列表。
gamma = np.vectorize(math.gamma)
verts = [polygon_under_graph(x, l**x * np.exp(-l) / gamma(x + 1))
         for l in lambdas]
facecolors = plt.colormaps['viridis_r'](np.linspace(0, 1, len(verts)))

创建多边形并添加到绘图中

我们使用 Matplotlib 的 PolyCollection 函数创建多边形,并将它们添加到绘图中。

poly = PolyCollection(verts, facecolors=facecolors, alpha=.7)
ax.add_collection3d(poly, zs=lambdas, zdir='y')

设置绘图的范围和标签

最后,我们使用 set 函数来设置绘图的范围和标签。

ax.set(xlim=(0, 10), ylim=(1, 9), zlim=(0, 0.35),
       xlabel='x', ylabel=r'$\lambda$', zlabel='probability')

显示绘图

我们使用 show 函数来显示绘图。

plt.show()

总结

在本教程中,我们学习了如何使用 Python 的 Matplotlib 库在三维绘图中创建填充折线图下方空间的多边形。我们使用 PolyCollection 函数来创建多边形,并使用 set 函数设置绘图的范围和标签。