見出し画像

【Python】散布図アニメーションに複数個のテキストラベルを追加する

またまたPythonのmatplotlibで遊んでみました。

前回の遊んでみたはコチラ⇩⇩⇩




1:はじめに

今回は、「データ散布図の時系列アニメーションに、データ単位にデータラベルをつける」が実装出来たので情報共有します。文章で書くと分かりにくいですが、出来上がりのGIFアニメーションはこんな感じです。

プロットデータごとに、データラベルがついています


というのも、Pythonのmatplotlibで
「散布図を作成する」
「散布図のデータにデータラベルを追加する」
「散布図のアニメーションを作成する」
「散布図アニメーションに固定でタイトルテキスト(≠データラベル)を追加する」
などはWebで検索すると参考サイトが結構ヒットするのですが、
「散布図」×「アニメーション」×「データ毎にデータラベル」
がなかなか見つからず(探し方が悪い可能性もおおいにある)、ようやくスマートなコードが書けました。


2:参考サイト

・matpplolibの散布図理解

・散布図アニメーション

・散布図のデータラベル

・artist要素



3:ソースコード

from matplotlib import pyplot as plt
from matplotlib.animation import ArtistAnimation
import japanize_matplotlib

#グラフ領域の作成
fig, ax = plt.subplots()
plt.xlabel("個人ポイント")
plt.ylabel("調整打点効率")
plt.xlim(-500,500)
plt.ylim(0,1600)
plt.grid(True)

#アニメーション要素のリスト
artists = []
for count in range(NUMOFWEEK):    #GIF1フレーム作成

    #グラフ 散布図
    x = []
    y = []
    labels = []

    for n in range(”散布図1枚に表示するデータ個数”):

        #散布図の表示するデータの、x座標、y座標。データラベルテキストを作る。

        x.append(point)
        y.append(tyosei)
        labels.append(label)



    # アニメーション化する要素の準備
    my_plot, = ax.plot(x, y, marker='o', linestyle='', color=COLOR)
    my_title = ax.text( 0, 1600, "タイトルテキスト",
                         ha='center', va='bottom',fontsize='xx-large')
    my_text = []
    for i in range(”散布図1枚に表示するデータ個数”):
        my_text.append(ax.text(x[i], y[i], labels[i]))

    #  アニメーション化する要素をリスト化
    artists.append([my_plot] + [my_title] + my_text)

#アニメーション化
anim = ArtistAnimation(fig, artists, interval=1000)


# 保存
anim.save("point.gif", writer="imagemagick")


4:解説っぽい何か

本当は苦手なんですが、肝のところだけ解説します。
アニメーション1枚1枚は、artist要素

artists = []

の中に

artists.append([my_plot] + [my_title] + my_text)

このように追加していきます。このappendメソッドの引数

①my_plotは、

my_plot, = ax.plot(x, y, marker='o', linestyle='', color=COLOR)

で(x,y)要素をまとめて一行でどばっとプロットしています。

②my_titleは、

    my_title = ax.text( 0, 1600, "タイトルテキスト",
                         ha='center', va='bottom',fontsize='xx-large')

で位置を指定してセット。

➂my_textは、

my_text = []
for i in range(”散布図1枚に表示するデータ個数”):
    my_text.append(ax.text(x[i], y[i], labels[i]))

が今回の肝ですが、①で散布図にプロットしたデータの個数分だけax.textオブジェクトのリストを作成しています。
リストはイテラブルなオブジェクトなので、artistsリストの引数指定時に[]をつけずにそのまま渡します。


5:余談

余談ですが、

my_plot, = ax.plot(x, y, marker='o', linestyle='', color=COLOR)

このイコールの前にあるカンマ。
Python以外のプログラム言語を知ってるとバグにしか見えないんですが、
そこにはPythonの深い設計思想が隠されていました。感動した。


以上、最後までお読みいただきありがとうございました。
ご質問、間違い指摘お気軽に。


頂いたサポートは、クリエイターとしての活動費として使用させていただきます!