Симуляция дождя с использованием Matplotlib

PythonPythonBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Этот практикум представляет собой пошаговое руководство по созданию симуляции дождя с использованием библиотеки Matplotlib для Python. В симуляции будут анимированы масштаб и непрозрачность 50 точек рассеяния для имитации капель дождя, падающих на поверхность.

Советы по работе с ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике с использованием 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):
    ## Get an index which we can use to re-spawn the oldest raindrop.
    current_index = frame_number % n_drops

    ## Make all colors more transparent as time progresses.
    rain_drops['color'][:, 3] -= 1.0/len(rain_drops)
    rain_drops['color'][:, 3] = np.clip(rain_drops['color'][:, 3], 0, 1)

    ## Make all circles bigger.
    rain_drops['size'] += rain_drops['growth']

    ## Pick a new position for oldest rain drop, resetting its size,
    ## color and growth factor.
    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)

    ## Update the scatter collection, with the new colors, sizes and positions.
    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()

Резюме

В этом практическом занятии мы узнали, как создать симуляцию дождя с использованием библиотеки Matplotlib для Python. Мы создали новую фигуру и оси, создали данные о дождях, построили точечный график, создали функцию обновления и создали анимацию с использованием объекта FuncAnimation.