【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の深い設計思想が隠されていました。感動した。
以上、最後までお読みいただきありがとうございました。
ご質問、間違い指摘お気軽に。
いいなと思ったら応援しよう!
頂いたサポートは、クリエイターとしての活動費として使用させていただきます!