乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

アニメーション

今回は数式から美しいアニメーションを作成できる
Manimのご紹介です

解説動画はこちら






Manimとは

Manim(Mathematical Animation Engine)
数学や物理を視覚的に表現するための
Pythonのアニメーションエンジンです。

3Blue1Brownの制作者(Grant Sanderson)によって開発
数学の教育動画で幅広く使用されています。

Python コードで数式やグラフをアニメーションとして
動画化してくれるライブラリです。


Manim を利用するうえで必要なこと

関連ライブラリのインストール
   - FFmpeg と必須ライブラリ
   - LaTeX (MacTeX) 
   - Manim本体
Python の知識
TeX 記法の知識

この辺りが必要です。


関連ライブラリのインストール

Manimを動かすには以下の3つが必要です。

1.FFmpeg と必須ライブラリ
2.LaTeX (MacTeX) 
3.Manim本体

早速インストールしていきましょう。

こちらはMac用のインストールコマンドです。
(Windowsの人はMacを買うか、Macを買いましょう)

1.FFmpeg と必須ライブラリのインストール

Manimが動画を描画・出力するために必要なツールです。
brew install ffmpeg py3cairo pkg-config


2.LaTeX (MacTeX) のインストール

美しい数式を描画するためのLaTeX環境です。
brew install --cask mactex-no-gui


3.Manim のインストール
pip install manim


インストール後の確認
manim --version



基本的な使い方

ファイルを作成して実行する

Pythonファイルとして作成した後
そのファイルをターミナルで実行することで
動画を作成できます。

manim -pqh ファイル名 シーン名


 - -p: レンダリング後に動画を自動再生
 - -q: 品質 (l=低, h=高, k=4K)
 - ファイル名 : hello.py
 - シーン名 : Hello


動画ファイルの出力先は
media/videos/...
になる(デフォルト)

hello.py というファイルでサンプルを用意しました。
# hello.py
from manim import *

class Hello(Scene):
    def construct(self):
        text = Text("どうもこんばんわ、乙pyです")
        self.play(Write(text))
        self.wait()

実行方法は次のようになります。

サンプルの実行
manim -pqh hello.py Hello




基本文法

インポートとコンストラクタの定義

ライブラリをインポートして
コンストラクタを最初に定義します。
from manim import *

class MyAnimation(Scene):
    def construct(self):


コンストラクタを作ったら
描きたいものを定義していきます。

変数名 = オブジェクト名(引数など)

self.play(): 
アニメーションを実行

.animate: 
オブジェクトのプロパティ(位置や色)を滑らかに変化

ReplacementTransform: 
前の物体を消して、次の物体へモーフィング

オブジェクトを生成して動かすサンプルも用意しました。

サンプルコード

# basicflow.py
# manim -pqh basicflow.py BasicFlow
from manim import *

class BasicFlow(Scene):
    def construct(self):
        # 1. オブジェクトの生成
        title = Text("Manimの基本操作", font_size=40)
        square = Square(color=BLUE, fill_opacity=0.5)
        circle = Circle(color=RED, fill_opacity=0.5)

        # 2. 配置の設定
        title.to_edge(UP) # 画面上端へ

        # 3. アニメーションの実行
        self.play(Write(title))        # 文字を書く
        self.play(DrawBorderThenFill(square)) # 枠線から塗りつぶし
        self.wait(1)

        # 4. 移動と変形 (Transform)
        self.play(
            square.animate.shift(LEFT * 2), # 左に動かしながら
            run_time=1
        )
        # 四角を円に変形させる
        self.play(ReplacementTransform(square, circle))
        self.play(circle.animate.shift(RIGHT * 4))
        
        self.wait(2)

オブジェクトを定義して配置し
アニメーション内容を書いていくことで
様々なアニメーションを作ることができます。




いろんなサンプルを見てみよう

5つの動画サンプルを用意しました。

1.正規分布のパラメータ変化
2.三角関数
3.フーリエ変換
4.ロジスティック写像
5.勾配降下法


どんなアニメーションを作れるかは
動画の方で確認してみてください。



まとめ


数学や物理系の綺麗なアニメーションを作るのは
かなりしんどいと思います。

このライブラリであれば、かなり綺麗な
アニメーションを作ることが出来るので
その道の動画を作りたい方は
試してみるのも面白いと思います。

それでは。









今回はワードクラウドの時系列変化を
アニメーション化する事ができるライブラリ
AnimatedWordCloudのご紹介です。


解説動画はこちら


ワードクラウドとは
データから単語を抜き出し
画像化したもののことです。

こんな感じのものです
2

単語の頻出数が文字の大きさになります。


このワードクラウドをアニメーション化する
ライブラリ「AnimatedWordCloud」を
リリースした方がいました。

Github


早速試してみましょう。
Google Colabで試せるコードになっています。


ライブラリのインストール
!pip install AnimatedWordCloudTimelapse==0.9.5

コマンドでインストールできますが
たまに失敗することもある様です。

Colabのバックエンドが
一定ではないためかと思いますが
何度か再起動してインストールすれば
成功すると思います。



ライブラリの読み込み

ワードクラウドの作成に必要な
ライブラリを全部読み込みします。
from AnimatedWordCloud import animate, Config
config = Config(output_path="/content/")

import pandas as pd
from datetime import datetime as dt
from sklearn.feature_extraction.text import CountVectorizer
configではアウトプット先の設定を行えます。
ワードクラウドに使用するデータの作成は
Pandasデータフレームを用いると楽です。

単語のカウント用に CountVectorizer を用います。



サンプルデータの読み込み


ここからは製作者様のコードを
一部引用させていただいています。

githubに付属されていた
イーロンマスクのツイートデータ(2012 - 2018)
の読み込みです。
df = pd.read_table("https://raw.githubusercontent.com/konbraphat51/AnimatedWordCloudExampleElon/main/elonmusk_tweets.csv",sep=",")

df["created_at"] = pd.to_datetime(df["created_at"])
df.head()

結果が出ていれば読み込み成功です。



ワードクラウド作成用のデータ構造


このライブラリでアニメーションワードクラウドを
作成するには、データ構造を合わせないといけません

このデータは次の様なデータ構造になっています。


[
(数値(年度),
 {'ワード' : 数値(回数) , ・・・ }
) , ・・・
]


2つの要素を持ったタプルが複数格納されたリストで
リストの要素のタプルは
1.数値型の時系列
2.キー:ワード , 値:回数の辞書
という構造になっています。

ちょっと複雑な構造体ですので
形に合わせる集計が必要になっています。


データの加工

こちらも元のコードを参考にしたコードとなります。
dfs_by_year = []
for year in range(2012, 2018):
    df_year = df[dt(year, 1, 1) <= df["created_at"] ]
    df_year = df_year[dt(year+1, 1, 1) > df_year["created_at"]]
    dfs_by_year.append(df_year)
    print(df_year.shape)

stopwords = ["the", "co", "http", "to", "of", "and", "on", "for", "just", "that", "with", "by", "is", "in", "at", "will"]

min_df = 10
counter = CountVectorizer(stop_words=stopwords)
dicts_by_year = []

for cnt in range(len(dfs_by_year)):
    np_year = counter.fit_transform(dfs_by_year[cnt]["text"]).toarray()
    df_year = pd.DataFrame(np_year, columns=counter.get_feature_names_out())
    sr_sum = df_year.sum(axis=0).sort_values(ascending=False)
    sr_sum = sr_sum[sr_sum >= min_df]

    #to dictionary
    dict_year = sr_sum.to_dict()
    dicts_by_year.append(dict_year)

wordvector_timelapse = []
for cnt in range(len(dicts_by_year)):
    year = 2012 + cnt
    wordvector_timelapse.append((year, dicts_by_year[cnt]))


ワードクラウドの作成

変数 = animate(データ, config) でワードクラウドの作成
configで指定したパスに
output.gif が保存される仕組みです
result = animate(wordvector_timelapse, config)



イメージの再生


出来上がったら見てみましょう。
from IPython.display import display, Image

with open('/content/output.gif','rb') as f:
    display(Image(data=f.read(), format='png',width=600))

2


ワードクラウドがアニメーション表示されると思います。

ツイートのデータなどは
良くワードクラウドで表現される事が多いかと思いますが
それを時系列でアニメーション化させる
表現手法は作成するのに結構手間がかかると思います。

それを少しのコードだけで
作成する事ができるのは
めちゃくちゃ便利だと思います。


このライブラリを公開された方のような人が
今後沢山出てきていただけると嬉しいですね。

今回は
アニメーションワードクラウドを
作成出来る
AnimatedWordCloud
のご紹介でした。

それでは

このページのトップヘ