29 ΠΌΠ°Ρ€Ρ‚Π° 2022

πŸπŸ“ˆ Как Β«ΠΎΠΆΠΈΠ²Π»ΡΡ‚ΡŒΒ» Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡ‚ΡŒ всСх красивыми анимациями с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ПО (систСмы PDM/PLM) с 1993 Π³ΠΎΠ΄Π°, компания "Π˜ΠΠ’Π•Π ΠœΠ•Π₯" (www.intermech.ru). Π’ 2020-ΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ» курсы "ΠžΡΠ½ΠΎΠ²Ρ‹ Data Science" (минская IT Academy) Π Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚-ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ тСхничСской Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ с английского языка.
ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ красивыС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΈΠ²Π»ΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ самых ΠΈΡΠΊΡƒΡˆΠ΅Π½Π½Ρ‹Ρ… Π·Ρ€ΠΈΡ‚Π΅Π»Π΅ΠΉ.
πŸπŸ“ˆ Как Β«ΠΎΠΆΠΈΠ²Π»ΡΡ‚ΡŒΒ» Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡ‚ΡŒ всСх красивыми анимациями с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

Если статичСских Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² нСдостаточно – нарисуСм постоянно ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ!

πŸπŸ“ˆ Как Β«ΠΎΠΆΠΈΠ²Π»ΡΡ‚ΡŒΒ» Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡ‚ΡŒ всСх красивыми анимациями с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Data Scientist Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, Π½ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅, ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ для восприятия людСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° ΠΈΡ… основС. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, гистограммы, Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Но Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, ΠΏΠΎ-настоящСму ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°ΡŽΡ‰ΡƒΡŽ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ – статичСских ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСдостаточно. Π’Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ динамичСскиС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

Когда Π²Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ, Π²Ρ‹ смоТСтС Π²ΠΎΡΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ знания для создания собствСнных красивых Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ.

Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ‹Ρ‚ общСния с Python’ом, ΠΈ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ манипуляции Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ – Π½Π΅ СдинствСнный, ΠΈ Ссли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсно ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ для создания Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ, Π½ΠΎ эти ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ – Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π²ΡƒΡ…ΠΌΠ΅Ρ€Π½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ, столбчатыС ΠΈ сСкторныС Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ ΠΈ Ρ‚. Π΄.

Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹

Π’ Python’С Π΅ΡΡ‚ΡŒ ΠΊΡƒΡ‡Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΠ°Ρ€ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ скрипт ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Π½ΡƒΠΆΠ½Ρ‹Π΅ для этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

        # Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import animation
    
  • NumPy ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания числовых массивов ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° тригономСтричСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (сокращаСтся Π΄ΠΎ np для удобства).
  • Pyplot ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° Matplotlib ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для рисования Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² (сокращаСтся Π΄ΠΎ plt для удобства).
  • Axes3D ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ создания Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΠΎΠΉ систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π² Π½Π°ΡˆΠΈΡ… Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ….
  • animation ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° Matplotlib ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ ΠΏΡƒΡ‚Π΅ΠΌ пСриодичСского Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π΅.
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ рисовании ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ², ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. Для этого я создал ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ синуса ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ массива, содСрТащСго значСния ΠΎΡ‚ 0 Π΄ΠΎ 20 (я ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠ» ΠΈΡ… ΠΊΠ°ΠΊ сСкунды Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ).

        # Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ массив
t = np.linspace(0, 20, 100)

# ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ массивы
x = np.sin(np.pi/5 * t)
y = np.sin(np.pi/3 * t)
z = np.linspace(0, 100, 100)

# Π—Π°Π΄Π°Π΅ΠΌ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ
dataSet = np.array([x, y, z])  # ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΠ΅ΠΌ наши ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹
numDataPoints = len(t)
    

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ Π±Π΅Π· объяснСний. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ массивами для задания собствСнных Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ dataSet ΠΈ numDataPoints Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ сСйчас ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ.

Ѐункция Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

Для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ нашСй ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ FuncAnimation ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ класса animation. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΎΠ±ΠΎΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь. FuncAnimation Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ создали ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‰ΡƒΡŽ Π»ΠΈΠ½ΠΈΠΈ, Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ ΠΏΡ€., ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π½Π°Π·ΠΎΠ²Π΅ΠΌ animate_func.

        def animate_func(num):
   ax.clear()  # ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ для обновлСния Π»ΠΈΠ½ΠΈΠΈ, Ρ‚ΠΎΡ‡ΠΊΠΈ,  
               # Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈ осСй  # ОбновляСм линию Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ (num+1 ΠΈΠ·-Π·Π° индСксации Python)
   ax.plot3D(dataSet[0, :num+1], dataSet[1, :num+1],
             dataSet[2, :num+1], c='blue')    # ОбновляСм Π»ΠΎΠΊΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΡ‡ΠΊΠΈ 
   ax.scatter(dataSet[0, num], dataSet[1, num], dataSet[2, num],
              c='blue', marker='o')    # ДобавляСм ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ
   ax.plot3D(dataSet[0, 0], dataSet[1, 0], dataSet[2, 0],    
              c='black', marker='o')    # Π—Π°Π΄Π°Π΅ΠΌ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ для осСй
   ax.set_xlim3d([-1, 1])
   ax.set_ylim3d([-1, 1])
   ax.set_zlim3d([0, 100])

   # ДобавляСм ΠΌΠ΅Ρ‚ΠΊΠΈ
   ax.set_title('Trajectory \nTime = ' + str(np.round(t[num], decimals=2)) + ' sec')
   ax.set_xlabel('x')
   ax.set_ylabel('y')
   ax.set_zlabel('z')
    

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ num, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡƒΡŽ Π² animate_func. Π­Ρ‚ΠΎ индСкс Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ шага Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Когда ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ animate_func Π² FuncAnimation, послСдняя Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ num. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π½Π°ΡˆΠ΅ΠΌΡƒ dataSet’у, созданному Ρ€Π°Π½Π΅Π΅.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ эта функция – ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ. ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ Π»ΠΈΠ½ΠΈΠΈ, Ρ‚ΠΎΡ‡ΠΊΠΈ, оси с ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ. Π—Π°Ρ‚Π΅ΠΌ функция добавляСт ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ линию Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ (ΠΎΡ‚ 0 Π΄ΠΎ num) ΠΈ Π»ΠΎΠΊΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΡ‡ΠΊΠΈ (Π½Π° шагС num). Π’ этой Ρ„ΠΈΠ³ΡƒΡ€Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ num Π½Π΅ показываСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ мСняСм Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ. Π—Π°Ρ‚Π΅ΠΌ функция опрСдСляСт наши Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΏΠΎ осям. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ эти ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ оси измСнялись ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ продвиТСния (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ваши оси станут динамичСскими).

НаконСц, наша функция Π·Π°Π΄Π°Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ Π½Π°ΡˆΠΈΡ… осСй. ΠœΠ΅Ρ‚ΠΊΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹: это x, y, z, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π΅ΠΊΠ°Ρ€Ρ‚ΠΎΠ²Ρ‹ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹. Π’ качСствС нСбольшой Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρƒ нас Π΅ΡΡ‚ΡŒ динамичСский Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΏΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ массивС, t. ΠœΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ эти сСкунды (с ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎ Π΄Π²ΡƒΡ… Ρ†ΠΈΡ„Ρ€ послС запятой) ΠΈ обновляСм ΠΈΡ… Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, это Π½Π΅ настоящиС сСкунды.

РисуСм Π½Π°ΡˆΡƒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ

ПослСдний шаг – это собствСнно Π²Ρ‹Π²ΠΎΠ΄ нашСй Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ FuncAnimation. НачнСм с создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ с Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ осями. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ FuncAnimation, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ, Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ создали, Π° Ρ‚Π°ΠΊΠΆΠ΅ значСния interval ΠΈ frames. Interval – это врСмя Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Ρ€Π΅ΠΉΠΌΠ°ΠΌΠΈ Π² миллисСкундах, Π° frames – это просто количСство Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ. Π”Π²Π° послСдних Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, Π½ΠΎ ΠΌΠ½Π΅ нравится Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ…, Ссли я Ρ…ΠΎΡ‡Ρƒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ анимация.

        # РисуСм Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ
fig = plt.figure()
ax = plt.axes(projection='3d')
line_ani = animation.FuncAnimation(fig, animate_func, interval=100,  
                                  frames=numDataPoints)
plt.show()
    

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄, ΠΈ Ссли всС сдСлано ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ваш Π³Ρ€Π°Ρ„ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ (ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ двиТСния Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠΉ):

πŸπŸ“ˆ Как Β«ΠΎΠΆΠΈΠ²Π»ΡΡ‚ΡŒΒ» Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡ‚ΡŒ всСх красивыми анимациями с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ нашСй Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свою Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ Π² Ρ„Π°ΠΉΠ» .gif, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ это:

        # БохраняСм Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ
f = r"c://Users/(Insert User)/Desktop/animate_func.gif"
writergif = animation.PillowWriter(fps=numDataPoints/6)
line_ani.save(f, writer=writergif)
    

НуТно Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° для сохранСния Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ f. Π—Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ количСство Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² Π² сСкунду, fps, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ Π² PillowWriter. Π― Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ numDataPoints, которая опрСдСляСт количСство Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² Π² FuncAnimation, Π½Π° 6, Ρ‡Ρ‚ΠΎΠ±Ρ‹ анимация Π·Π°Π½ΠΈΠΌΠ°Π»Π° 6 сСкунд Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ΠœΡ‹ познакомились с ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ mplot3d ΠΈ animation, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ эти Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Ρ‹ .gif. Бпасибо Π·Π° ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅!

***

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•