altairでとあるアイドルグループのメンバー在籍期間のチャート化してみた


記事の内容

数年前から転校少女*というアイドルグループを応援しているのですが、メンバーの入れ替わりが激しく誰がいつ在籍していたのか分からなくなったので「altair」というライブラリを使って可視化してみるという内容です。

altairのインストール

pipでインストールします

pip install altair

準備データ

tenkou.csv
No,Member,Start,End,Color,Color Name
1,松井さやか,2014/11/01,2021/05/01,#ff6666,red
2,塩川莉世,2014/11/01,2021/05/01,#ff99cc,pink
3,岡田夢以,2014/11/01,2019/11/16,#66ccff,blue
4,栗田恵美,2014/11/01,2018/04/28,#66ff66,green
5,松本香穂,2014/11/01,2018/04/28,#ffff66,yellow
6,古森結衣,2017/01/28,2018/04/28,#FFA500,orange
7,渚まお,2017/01/28,2019/04/30,#DFA0D2,purple
8,千葉妃理,2017/06/01,2018/07/26,#0000ff,black
9,寺田葵,2018/09/16,2020/12/26,#00A474,black
10,小西杏優,2019/08/25,2020/01/12,#FFA533,black
11,上原わかな,2019/08/25,2020/04/23,#800080,black
12,小倉月奏,2019/08/25,2021/04/16,#FFFF00,black
13,佐藤かれん,2020/11/21,2021/05/01,#800088,black
14,成島有咲,2020/11/21,2021/05/01,#66ddff,black
15,佐々木美紅,2020/11/21,2021/05/01,#FFA566,black

データの内容はNo(ソート用)、メンバーの名前、在籍期間を表すstartとend、グラフの色を設定するためのColor、Color Nameを用意しました。
まだ在籍しているメンバーのendはとりあえずで「2021/05/01」を設定しています。

コード1

早速コードを書いてみました

chart.py
import pandas as pd
import altair as alt

df = pd.read_csv("tenkou.csv")

df["Start"] = pd.to_datetime(df["Start"])
df["End"] = pd.to_datetime(df["End"])

chart = alt.Chart(df).mark_bar().encode(
    x='Start',
    x2='End',
    y=alt.Y('Member',sort=list(df.sort_values(['No']))),
    color='Color'
    ).properties(
        width=1500,
        height=500
    ).interactive()

chart.show()

実行結果

画像なので分からないのですが、チャートの部分は横スクロールが出来るようになっています。
横スクロールが出来るようになってはいますが、何も設定していないと「properties」の「width」で指定した幅でデータが表示されるように横軸の間隔が調整されるみたいです。

問題と原因

用意したデータの「Color」にはメンバーの担当カラーを設定していたのですが、グラフの色が用意した色になっていない。

調べたところ、以下の部分は色を指定するのではなく、色分けするデータ群に対するラベルの意味合いみたいです。

    color='Color'

例えば、一期生、二期生・・というデータを加えて、それぞれ色分けするような場合に使えます。

色はaltairが勝手に設定するみたいで、このやり方だと自分で色の設定は出来ないっぽい。
色の設定は別でやる必要あり。

コード2

chart2.py
import pandas as pd
import altair as alt

df = pd.read_csv("tenkou.csv")

df["Start"] = pd.to_datetime(df["Start"])
df["End"] = pd.to_datetime(df["End"])

chart = alt.Chart(df).mark_bar(color='Red').encode(
    x='Start',
    x2='End',
    y=alt.Y('Member',sort=list(df.sort_values(['No']))),
    ).properties(
        width=1500,
        height=500
    ).interactive()

chart.show()

変更点としては、mark_barに色を設定したのと、colorの設定を消しただけ

実行結果

設定した色に変更されました。
今回は赤だけを設定したのですが、メンバー毎に色を設定したくてリストで担当カラーを渡してみましたがエラーとなり失敗しました。
現状、自分で好きな色に設定することは難しそう

感想

割と簡単かつ綺麗に描画された点は良いなと思いました。
今後使っていく場合、ドキュメントが若干分かり辛いのと、情報が少ないので細かい使い方を調べるのには少し苦労しそう。
あとは、応援してるグループのメンバー在籍期間を可視化すると改めて入れ替わりが激しいなと思い知った。