Matplotlib 降雨模拟

PythonPythonBeginner
立即练习

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

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

简介

本实验是一个循序渐进的教程,介绍如何使用 Python 的 Matplotlib 库创建降雨模拟。该模拟将对 50 个散点的大小和透明度进行动画处理,以模拟雨滴落在表面上的情景。

虚拟机使用提示

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

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

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

创建新的图形和坐标轴

第一步是创建一个新的图形以及填充该图形的坐标轴。这将是绘制模拟的画布。

fig = plt.figure(figsize=(7, 7))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_xlim(0, 1), ax.set_xticks([])
ax.set_ylim(0, 1), ax.set_yticks([])

创建降雨数据

接下来,我们将创建降雨数据。我们将在随机位置创建 50 个雨滴,每个雨滴具有随机的增长速度和随机颜色。

n_drops = 50
rain_drops = np.zeros(n_drops, dtype=[('position', float, (2,)),
                                      ('size',     float),
                                      ('growth',   float),
                                      ('color',    float, (4,))])

rain_drops['position'] = np.random.uniform(0, 1, (n_drops, 2))
rain_drops['growth'] = np.random.uniform(50, 200, n_drops)

构建散点图

现在,我们将构建散点图,在动画过程中随着雨滴的变化对其进行更新。

scat = ax.scatter(rain_drops['position'][:, 0], rain_drops['position'][:, 1],
                  s=rain_drops['size'], lw=0.5, edgecolors=rain_drops['color'],
                  facecolors='none')

创建更新函数

更新函数将由 FuncAnimation 对象调用,以便在动画过程中更新散点图。

def update(frame_number):
    ## 获取一个索引,用于重新生成最老的雨滴。
    current_index = frame_number % n_drops

    ## 随着时间推移,使所有颜色变得更透明。
    rain_drops['color'][:, 3] -= 1.0/len(rain_drops)
    rain_drops['color'][:, 3] = np.clip(rain_drops['color'][:, 3], 0, 1)

    ## 使所有圆圈变大。
    rain_drops['size'] += rain_drops['growth']

    ## 为最老的雨滴选择一个新位置,重置其大小、颜色和增长因子。
    rain_drops['position'][current_index] = np.random.uniform(0, 1, 2)
    rain_drops['size'][current_index] = 5
    rain_drops['color'][current_index] = (0, 0, 0, 1)
    rain_drops['growth'][current_index] = np.random.uniform(50, 200)

    ## 使用新的颜色、大小和位置更新散点集合。
    scat.set_edgecolors(rain_drops['color'])
    scat.set_sizes(rain_drops['size'])
    scat.set_offsets(rain_drops['position'])

创建动画

最后,我们将使用 FuncAnimation 对象创建动画,传入图形、更新函数、帧之间的时间间隔(以毫秒为单位)以及要保存的帧数。

animation = FuncAnimation(fig, update, interval=10, save_count=100)
plt.show()

总结

在这个实验中,我们学习了如何使用 Python 的 Matplotlib 库创建一个降雨模拟。我们创建了一个新的图形和坐标轴,创建了降雨数据,构建了散点图,创建了更新函数,并使用 FuncAnimation 对象创建了动画。