すのふらてっく

すのふらてっく

日々の備忘録

matplotlibでアイカツ!のCD売上枚数をグラフにする

もうひとつのブログ記事でアイカツのCD売上枚数から、コンテンツの隆盛について書こうと思っているんだが、ひとまず先にテック部分について書く。

実行時の結果及び分析結果については以下をご参照ください。
snofra.hatenablog.com

snofra.hatenablog.com


作ろうとしたきっかけは、アイカツスターズ!シングル売上枚数について調べたので、何か語るためにグラフにプロットしたろ!って思ったから。
tableauとかBIツールの選択肢もあったけど、pythonの勉強も兼ねてmatplotlibで表示させる。

仕事でも使っていない要素なので、もっとうまくいく方法があれば教えてほしいっす。

時系列データだと、とりま折れ線グラフにしとけばええやろ的な安易さで折れ線にしたんだけど、インパクトには欠けるかなーという印象。
手法をインプットしとかないと、こういう時にテンプレすら分からないということになって恥ずかしい思いするよなー。

恥ずかしい思いしてナンボなので、ソースも公開する。


分析軸

アイカツ!』から『アイカツスターズ!』までの流れを調査したいので、時系列データとしてCDの発売日を軸にする。

調査内容としては以下5点くらい。

  • アイカツ!シリーズのリリース間隔はどのくらいか?
  • ネットの検索数と比較して、「どこでバズって、ネットで盛り上がっているときCDは売れているのか?」
  • アイカツ!シリーズの根底はデータカードダスっつうゲームなので、「ゲームの新しいバージョンがリリースした場合のCDの売れ行きは変わるのか?」
  • ライバルであるプリパラシリーズとの対比。ぶっちゃけ「どこでプリパラに負けたのか」
  • プリパラシリーズとのシングル・アルバムの売り上げ差


CD売上については初週と累計が分かっているので、「初週の売り上げ結果が累計売上もどう影響するのか」ってのもあったけど、次回やる。
ここの観点は回帰分析ですな。統計素人なんでいろいろ勉強してから。


ソース

python 3.5
jupiter notebook上での実装


事前処理

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import matplotlib.dates as mdates
from dateutil.relativedelta import relativedelta
%pylab inline --no-import-all

# 定数
CLASS = '分類'
SERIES = 'シリーズ'
TITLE = 'タイトル'
SALES_DATE = '発売日'
SALES_CNT = '累計枚数'

SINGLE = 'SG'
ALBUM = 'AL'

AIKATSU_START_DATE = '2012-10-08'
AIKATSU_AKARI_GENE_START_DATE = '2014-10-02'
AIKATSU_STARS_START_DATE = '2016-04-02'
PREPARA_START_DATE = '2014-07-05'
IDOL_TIME_PREPARA_START_DATE = '2017-04-04'

AIKATSU_START_LABEL = 'aikatsu! Start'
AIKATSU_AKARI_GENE_START_LABEL = 'aikatsu!AkariGeneration Start'
AIKATSU_STARS_START_LABEL = 'aikatsuStars! Start'
PREPARA_START_LABEL = 'PriPara Start'
IDOL_TIME_PREPARA_START_LABEL = 'idolTimePrePara Start'

Y_AXIS_LABEL = 'CD sales count'


関数部

def x_axis_label(minday, maxday):
    """
    x軸のラベルをyyyy-mmで取得
    :param minday:ラベルの開始日
           maxday:ラベルの終了日
    :return:開始日から終了日までのyyyy-mm形式のリスト
    
    """
    
    # 開始終了が何年何ヶ月何日差があるかチェック
    delta = relativedelta(maxday, minday)
    # 何ヶ月差が発生しているか(表示の理由から+1ヶ月する)
    month_count = delta.years * 12 + delta.months + 1
    # 開始日から差が発生しているnヶ月分をaddする
    list_date =  [minday + relativedelta(months=i) for i in range(month_count)]

    return [str(date.strftime('%Y')) + '-' + str(date.strftime('%m')) for date in list_date] 

def release_interval(release_date, titles):
    """
    次のCDリリースすまでにどのくらいの間隔があいているか
    :param release_date:リリース日
                 titles:曲名
    """
    # 何ヶ月スパンで発売されているか
    base = None
    list_release = []
    for index, date in enumerate(release_date):
        # 1行目は比較対象がないので次の行へ
        if index == 0:
            base = date
            continue
        # 開始終了が何年何ヶ月何日差があるかチェック
        delta = relativedelta(date, base)
        # 何ヶ月差が発生しているか
        month_count = delta.years * 12 + delta.months
        # 月を開けずにリリースされているか
        if month_count == 0:
            # 同時発売かどうか
            if delta.days == 0:
                release = '前と同時発売'
            else:
                release = str(delta.days) + '日後'
        else:
            release = '約' + str(month_count) + 'ヶ月後'
        # リストにadd
        list_release.append(release)
        base = date

    # タイトルと合わせる
    for index, title in enumerate(titles):
        if index == 0:
            print('-' + ',' + title)
            continue
        print(list_release[index - 1] + ',' + title)

x_axis_label関数は、グラフにプロットしたときにX軸のラベルに使ってる。

単純に終了日-開始日の差をだして、それをnヶ月離れているかって算出した後に、開始日にn分、月を足しているだけ。

最後にyyyy-mm形式に直しているんだけど、ここループ2回やっているのでもう少しシンプルにならんのかなーとは思ってる。


これを実装するときに詰まったのが、重複値をどうするかっていう点。

最終的にyyyy-mm形式にするんだけど、CDが同月に発売されると当然値が重複する。
それを削除しなきゃいけないんだけど、setを使用すると重複は削除されるんだけどソートが崩れてしまう。

いったんsetにすることで重複要素が自動的に削除されます。

ただしこの方法だと要素の順番が変わることもあるようです。要素の順番を保ちたい場合には、普通にforループを回す形になります。 Python Tips:リストから重複した要素を削除したい - Life with Python

なので、まあ普通にループして中で加工している感じ。


release_interval関数はx_axis_label関数をちょろっと変えただけで基本は変わらない。csv形式になるように加工している。

結果をとりあえずprintしているだけなので、csvに吐き出すならoutputの実装がいるかな。


ファイルのロード抽出

# csvファイルのロード
df_aikatsu_cd = pd.read_csv('xxx/yyy/zz/cd_sales.csv', parse_dates=[2])
df_trend = pd.read_csv('xxx/yyy/zz/multiTimeline.csv', parse_dates=[0])
df_game_release = pd.read_csv('xxx/yyy/zz/game_release.csv', parse_dates=[2])
df_prepara_cd = pd.read_csv('xxx/yyy/zz/cd_sales_prepara.csv', parse_dates=[2])
df_trend_prepara = pd.read_csv('xxx/yyy/zz/multiTimeline_prepara.csv', parse_dates=[0])

# ■アイカツ!シリーズCD売上枚数
# シリーズ売上枚数(サントラ除く)
sales_day_all = df_aikatsu_cd[df_aikatsu_cd[CLASS] != 'ST']
x_sales_day_all = sales_day_all [SALES_DATE].fillna('')
y_sales_count_all = [int(i.replace(',', '')) for i in sales_day_all [SALES_CNT].fillna('0')]
# アイカツ!売上枚数
sales_day_aikatsu = sales_day_all[sales_day_all[SERIES] == 'アイカツ!']
x_sales_day_aikatsu = sales_day_aikatsu [SALES_DATE].fillna('')
y_sales_count_aikatsu = [int(aikatu_cd_num.replace(',', '')) for aikatu_cd_num in sales_day_aikatsu [SALES_CNT].fillna('0')]
title_aikatsu = sales_day_aikatsu[TITLE]
# アイカツスターズ!売上枚数
sales_day_stars = sales_day_all[sales_day_all[SERIES] == 'アイカツスターズ!']
x_sales_day_stars = sales_day_stars [SALES_DATE].fillna('')
y_sales_count_stars = [int(stars_cd_num.replace(',', '')) for stars_cd_num in sales_day_stars [SALES_CNT].fillna('0')]
title_stars = sales_day_stars[TITLE]
# アイカツ! フォトonステージ!!売上枚数
sales_day_photo = sales_day_all[sales_day_all[SERIES] == 'アイカツ! フォトonステージ!!']
x_sales_day_photo = sales_day_photo [SALES_DATE].fillna('')
y_sales_count_photo = [int(photo_cd_num.replace(',', '')) for photo_cd_num in sales_day_photo [SALES_CNT].fillna('0')]
# single売上枚数
sales_day_single = df_aikatsu_cd[df_aikatsu_cd[CLASS] == SINGLE]
x_sales_day_single = sales_day_single [SALES_DATE].fillna('')
y_sales_count_single = [int(i.replace(',', '')) for i in sales_day_single [SALES_CNT].fillna('0')]
# album売上枚数
sales_day_album = df_aikatsu_cd[df_aikatsu_cd[CLASS] == ALBUM]
x_sales_day_album = sales_day_album [SALES_DATE].fillna('')
y_sales_count_album = [int(i.replace(',', '')) for i in sales_day_album [SALES_CNT].fillna('0')]

# ■googleトレンド数(検索ワード:アイカツ)
x_trend_day = df_trend ["週"].fillna('')
y_trend_count = df_trend ["トレンド数"]

# ■DCD(ゲーム)のリリース日
# アイカツ!
x_game_release_day_aikatsu = df_game_release[df_game_release[SERIES] == 'アイカツ!'].リリース日
y_for_disp_aikatsu = [15000 for i in x_game_release_day_aikatsu]
# アイカツスターズ!
x_game_release_day_stars = df_game_release[df_game_release[SERIES] == 'アイカツスターズ!'].リリース日
y_for_disp_stars = [15000 for i in x_game_release_day_stars]

# ■プリパラシリーズCD売上枚数
# シリーズ売上枚数
x_sales_day_prepara = df_prepara_cd [SALES_DATE].fillna('')
y_sales_count_prepara = [int(i.replace(',', '')) for i in df_prepara_cd [SALES_CNT].fillna('0')]
# single売上枚数
sales_day_single_prepara = df_prepara_cd[df_prepara_cd[CLASS] == SINGLE]
x_sales_day_single_prepara = sales_day_single_prepara [SALES_DATE].fillna('')
y_sales_count_single_prepara = [int(i.replace(',', '')) for i in sales_day_single_prepara [SALES_CNT].fillna('0')]
# album売上枚数
sales_day_album_prepara = df_prepara_cd[df_prepara_cd[CLASS] == ALBUM]
x_sales_day_album_prepara = sales_day_album_prepara [SALES_DATE].fillna('')
y_sales_count_album_prepara = [int(i.replace(',', '')) for i in sales_day_album_prepara [SALES_CNT].fillna('0')]

# ■googleトレンド数(検索ワード:プリパラ)
x_trend_day_prepara = df_trend_prepara ["週"].fillna('')
y_trend_count_prepara = df_trend_prepara ["トレンド数"]

pandasのライブラリを使うとめちゃくそ楽なので、つかっている。

parse_datesで日付部分をtimestamp型に変えている。
これいれないと日付抽出のときに型で落ちるので、ロード時に型変換するようにしている。
ちなみにエンコードUTF-8じゃないとロード時に落ちる。取込元データのエンコードは事前にやっておかなきゃいけない。


また、ファイル上ブランクデータが含まれているので、fillna()で穴埋めする。
しないとNaNになるので、事前に処理しとく。


ゲームのリリース日の15000という数値は、Y軸がCDの売上枚数なので、それに合わせてまあ適当に設定。
とりあえず、リリース日だよってマーカーがグラフ上に表示できればいいので。


release_interval関数の呼び出し

# ■CDのリリース間隔のチェック
# アイカツ!
print('アイカツ!')
release_interval(x_sales_day_aikatsu, title_aikatsu)
# アイカツスターズ!
print('アイカツスターズ!')
release_interval(x_sales_day_stars, title_stars)

ここの実行結果はこんな感じ

アイカツ!
-,Signalize!/カレンダーガール/わか・ふうり・すなお・りすこ from STAR☆ANIS
約1ヶ月後,オーディションシングル① First Live!/わか・ふうり・すなお・りすこ・れみ from STAR☆ANIS
約1ヶ月後,オーディションシングル② Second Show!/わか・ふうり・すなお from STAR☆ANIS
28日後,オーディションシングル③ Third Action!/りすこ・すなお・え from STAR☆ANIS
約3ヶ月後,ダイヤモンドハッピー / ヒラリ/ヒトリ/キラリ/STAR☆ANIS
前と同時発売,FOURTH PARTY!/STAR☆ANIS
約3ヶ月後,KIRA☆Power/オリジナルスター☆彡/STAR☆ANIS
約1ヶ月後,COOL MODE/わか・ふうり・ゆな・すなお from STAR☆ANIS
約2ヶ月後,Sexy Style/STAR☆ANIS
約1ヶ月後,Calendar Girls/STAR☆ANIS
21日後,SHINING LINE/Precious/STAR☆ANIS
約1ヶ月後,POP ASSORT/STAR☆ANIS
約2ヶ月後,Cute Look/STAR☆ANIS
28日後,Du-Du-Wa DO IT!!/Good morning my dream/AIKATSU☆STARS!
約1ヶ月後,劇場版 アイカツ! ボーカル集 輝きのエチュード
約1ヶ月後,Shining Star
STAR☆ANIS
14日後,Beautiful Song/AIKATSU☆STARS!
約2ヶ月後,Lovely Party Collection/チュチュ・バレリーナ/AIKATSU☆STARS!
約1ヶ月後,Joyful Dance/AIKATSU☆STARS!
約2ヶ月後,Colorful Smile/AIKATSU☆STARS!
約2ヶ月後,START DASH SENSATION/AIKATSU☆STARS!
約2ヶ月後,Wonderful Tour/AIKATSU☆STARS!
約1ヶ月後,Lovely Party!!/AIKATSU☆STARS!
約15ヶ月後,アイカツ! COMPLETE CD-BOX

アイカツスターズ!
-,スタートライン!/episode Solo/AIKATSU☆STARS!
28日後,ハルコレ/AIKATSU☆STARS!
約1ヶ月後,ナツコレ/AIKATSU☆STARS!
21日後,劇場版アイカツスターズ! ボーカルシングル
約2ヶ月後,1,2,Sing for You!/So Beautiful Story/AIKATSU☆STARS!
21日後,アキコレ/AIKATSU☆STARS!
約2ヶ月後,フユコレ/AIKATSU☆STARS!
約2ヶ月後,STARDOM!/Bon Bon Voyage!/AIKATSU☆STARS!
約2ヶ月後,Fantastic Ocean/AIKATSU☆STARS!
約3ヶ月後,MUSIC of DREAM!!!/森のひかりのピルエット/AIKATSU☆STARS!!
約1ヶ月後,Endless Sky/AIKATSU☆STARS!


グラフのプロット

ブログ用に4枚縦に出力するようにしている。ついでにグラフも保存している。

# ■グラフのプロット
# X軸のラベルを取得
list_x_axis_label = x_axis_label(min(x_sales_day_all), max(x_sales_day_all))

# ■googleトレンド数とアイカツ!シリーズのCD売上枚数の比較
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100) # 表示サイズ
ax = plt.subplot()
# アイカツ!シリーズのCD売上枚数をplot
ax.plot(x_sales_day_all, 
        y_sales_count_all, 
        linewidth=2, 
        marker='o', 
        color='#DA5019', 
        label='CD sales num')
# アニメの初回放送日
ax.plot(AIKATSU_START_DATE, 
        15000, 
        linewidth=2, 
        marker='x', 
        markersize=15, 
        markeredgewidth=2, 
        color='#BF1E56', 
        label=AIKATSU_START_LABEL)
ax.plot(AIKATSU_AKARI_GENE_START_DATE, 
        15000, 
        linewidth=2, 
        marker='x',
        markersize=15, 
        markeredgewidth=2, 
        color='#EDAD0B', 
        label=AIKATSU_AKARI_GENE_START_LABEL)
ax.plot(AIKATSU_STARS_START_DATE, 
        15000, linewidth=2, 
        marker='x', 
        markersize=15, 
        markeredgewidth=2, 
        color='#D8E212', 
        label=AIKATSU_STARS_START_LABEL)
plt.ylabel(Y_AXIS_LABEL)

# x軸の設定(表示yyyy-mmで1ヶ月単位で表示)
xfmt = mdates.DateFormatter("%y/%m")
xloc = mdates.DayLocator(bymonthday=[1])
ax.xaxis.set_major_locator(xloc)
ax.xaxis.set_major_formatter(xfmt)
ax.set_xticklabels(list_x_axis_label, rotation = 90)# 表示ラベルと傾き
ax.legend(loc=0) # 凡例

# googleトレンド数をplot
ax2 = ax.twinx()
ax2.plot(x_trend_day, 
         y_trend_count, 
         color='#3261AB', 
         label="aikatsu! trend num")
ax2.legend(loc=2) # 凡例
plt.ylabel("trend count")

ax.grid(True)
plt.savefig('CDsales_vs_trend.png') # グラフのダウンロード
plt.show()

# ■各アイカツ!シリーズタイトル別のCD売上枚数と、DCDのリリース日の比較
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
ax = plt.subplot()
# 各アイカツ!シリーズタイトル別のCD売上枚数をplot
ax.plot(x_sales_day_aikatsu, 
        y_sales_count_aikatsu, 
        marker='o', 
        label='aikatsu!CD sales num')
ax.plot(x_sales_day_stars, 
        y_sales_count_stars, 
        marker='o', 
        label='aikatsuStars!CD sales num')
ax.plot(x_sales_day_photo, 
        y_sales_count_photo, 
        marker='o', 
        label='aikatsu!Photo_on_stage!!CD sales num')
# DCDのリリース日をplot
ax.plot(x_game_release_day_aikatsu, 
        y_for_disp_aikatsu, 
        linewidth=0, 
        marker='x',
        markersize=15, 
        markeredgewidth=1, 
        color='#23AC0E', 
        label='DCD aikatsu!Release')
ax.plot(x_game_release_day_stars, 
        y_for_disp_stars, 
        linewidth=0, 
        marker='x',
        markersize=15, 
        markeredgewidth=1, 
        color='#EDAD0B', 
        label='DCD aikatsuStars!Release')
plt.ylabel(Y_AXIS_LABEL)

# x軸の設定(表示yyyy-mmで1ヶ月単位で表示)
xfmt = mdates.DateFormatter("%y/%m")
xloc = mdates.DayLocator(bymonthday=[1])
ax.xaxis.set_major_locator(xloc)
ax.xaxis.set_major_formatter(xfmt)
ax.set_xticklabels(list_x_axis_label, rotation = 90)# 表示ラベルと傾き
ax.legend(loc=0) # 凡例

ax.grid(True)
plt.savefig('CDsales_vs_DCD.png') # グラフのダウンロード
plt.show()

# ■アイカツ!シリーズと、プリパラシリーズのCD売上枚数の比較
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100) # 表示サイズ
ax = plt.subplot()
# アイカツ!シリーズのCD売上枚数をplot
ax.plot(x_sales_day_all, 
        y_sales_count_all, 
        linewidth=2, 
        marker='o', 
        color='#DA5019', 
        label='aikatsu!CD sales num')
# プリパラシリーズのCD売上枚数をplot
ax.plot(x_sales_day_prepara, 
        y_sales_count_prepara, 
        linewidth=2, 
        marker='o', 
        color='#009F8C', 
        label='PriParaCD sales num')
# アニメの初回放送日
ax.plot(AIKATSU_START_DATE, 
        20000, 
        linewidth=2, 
        marker='x', 
        markersize=15, 
        markeredgewidth=2, 
        color='#BF1E56', 
        label=AIKATSU_START_LABEL)
ax.plot(AIKATSU_AKARI_GENE_START_DATE, 
        20000, 
        linewidth=2, 
        marker='x',
        markersize=15, 
        markeredgewidth=2, 
        color='#EDAD0B', 
        label=AIKATSU_AKARI_GENE_START_LABEL)
ax.plot(AIKATSU_STARS_START_DATE, 
        20000, linewidth=2, 
        marker='x', 
        markersize=15, 
        markeredgewidth=2, 
        color='#D8E212', 
        label=AIKATSU_STARS_START_LABEL)
ax.plot(PREPARA_START_DATE, 
        18000, 
        linewidth=2, 
        marker='o', 
        markersize=15, 
        color='#23AC0E', 
        label=PREPARA_START_LABEL)
ax.plot(IDOL_TIME_PREPARA_START_DATE, 
        18000, 
        linewidth=2, 
        marker='o', 
        markersize=15, 
        color='#A4C520', 
        label=IDOL_TIME_PREPARA_START_LABEL)
plt.ylabel(Y_AXIS_LABEL)

# x軸の設定(表示yyyy-mmで1ヶ月単位で表示)
xfmt = mdates.DateFormatter("%y/%m")
xloc = mdates.DayLocator(bymonthday=[1])
ax.xaxis.set_major_locator(xloc)
ax.xaxis.set_major_formatter(xfmt)
ax.set_xticklabels(list_x_axis_label, rotation = 90)# 表示ラベルと傾き
ax.legend(loc=0) # 凡例

# googleトレンド数をplot
ax2 = ax.twinx()
ax2.plot(x_trend_day, 
         y_trend_count, 
         color='#3261AB', 
         label="aikatsu! trend num")
ax2.plot(x_trend_day_prepara, 
         y_trend_count_prepara, 
         color='#C0D860', 
         label="prepara trend num")
ax2.legend(loc=2) # 凡例
plt.ylabel("trend count")

ax.grid(True)
plt.savefig('aikatsu_vs_prepara_all.png') # グラフのダウンロード
plt.show()

# ■アイカツ!シリーズと、プリパラシリーズのCD売上枚数の比較(シングル)
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100) # 表示サイズ
ax = plt.subplot()
# アイカツ!シリーズのCD売上枚数をplot
ax.plot(x_sales_day_single, 
        y_sales_count_single, 
        linewidth=2, 
        marker='o', 
        color='#DA5019', 
        label='aikatsu! series Single')
# プリパラシリーズのCD売上枚数をplot
ax.plot(x_sales_day_single_prepara, 
        y_sales_count_single_prepara, 
        linewidth=2, 
        marker='o', 
        color='#009250', 
        label='Prepara series Single')
# アニメの初回放送日
ax.plot(AIKATSU_AKARI_GENE_START_DATE, 
        14000, 
        linewidth=2, 
        marker='x',
        markersize=15, 
        markeredgewidth=2, 
        color='#EDAD0B', 
        label=AIKATSU_AKARI_GENE_START_LABEL)
ax.plot(AIKATSU_STARS_START_DATE, 
        14000, linewidth=2, 
        marker='x', 
        markersize=15, 
        markeredgewidth=2, 
        color='#D8E212', 
        label=AIKATSU_STARS_START_LABEL)
ax.plot(PREPARA_START_DATE, 
        12000, 
        linewidth=2, 
        marker='o', 
        markersize=15, 
        color='#23AC0E', 
        label=PREPARA_START_LABEL)
ax.plot(IDOL_TIME_PREPARA_START_DATE, 
        12000, 
        linewidth=2, 
        marker='o', 
        markersize=15, 
        color='#A4C520', 
        label=IDOL_TIME_PREPARA_START_LABEL)
plt.ylabel(Y_AXIS_LABEL)

# x軸の設定(表示yyyy-mmで1ヶ月単位で表示)
xfmt = mdates.DateFormatter("%y/%m")
xloc = mdates.DayLocator(bymonthday=[1])
ax.xaxis.set_major_locator(xloc)
ax.xaxis.set_major_formatter(xfmt)
ax.set_xticklabels(list_x_axis_label, rotation = 90)# 表示ラベルと傾き
ax.legend(loc=0) # 凡例

ax.grid(True)
plt.savefig('aikatsu_vs_prepara_single.png') # グラフのダウンロード
plt.show()

# ■アイカツ!シリーズと、プリパラシリーズのCD売上枚数の比較(アルバム)
# startが変わるので、X軸のラベルを変更(開始日:アイカツ/終了日:プリパラ)
list_x_axis_label = x_axis_label(min(x_sales_day_album), max(x_sales_day_album_prepara))

plt.figure(figsize=(20, 10), dpi=100, linewidth = 100) # 表示サイズ
ax = plt.subplot()
# アイカツ!シリーズのCD売上枚数をplot
ax.plot(x_sales_day_album, 
        y_sales_count_album, 
        linewidth=2, 
        marker='o', 
        color='#DA5019', 
        label='aikatsu! series Album')
# プリパラシリーズのCD売上枚数をplot
ax.plot(x_sales_day_album_prepara, 
        y_sales_count_album_prepara, 
        linewidth=2, 
        marker='o', 
        color='#009250', 
        label='Prepara series Album')
# アニメの初回放送日
ax.plot(AIKATSU_AKARI_GENE_START_DATE, 
        14000, 
        linewidth=2, 
        marker='x',
        markersize=15, 
        markeredgewidth=2, 
        color='#EDAD0B', 
        label=AIKATSU_AKARI_GENE_START_LABEL)
ax.plot(AIKATSU_STARS_START_DATE, 
        14000, linewidth=2, 
        marker='x', 
        markersize=15, 
        markeredgewidth=2, 
        color='#D8E212', 
        label=AIKATSU_STARS_START_LABEL)
ax.plot(PREPARA_START_DATE, 
        12000, 
        linewidth=2, 
        marker='o', 
        markersize=15, 
        color='#23AC0E', 
        label=PREPARA_START_LABEL)
ax.plot(IDOL_TIME_PREPARA_START_DATE, 
        12000, 
        linewidth=2, 
        marker='o', 
        markersize=15, 
        color='#A4C520', 
        label=IDOL_TIME_PREPARA_START_LABEL)
plt.ylabel(Y_AXIS_LABEL)

# x軸の設定(表示yyyy-mmで1ヶ月単位で表示)
xfmt = mdates.DateFormatter("%y/%m")
xloc = mdates.DayLocator(bymonthday=[1])
ax.xaxis.set_major_locator(xloc)
ax.xaxis.set_major_formatter(xfmt)
ax.set_xticklabels(list_x_axis_label, rotation = 90)# 表示ラベルと傾き
ax.legend(loc=0) # 凡例

ax.grid(True)
plt.savefig('aikatsu_vs_prepara_album.png') # グラフのダウンロード
plt.show()

ここで詰まったのがX軸をどうするかという点。
今は1ヶ月単位で並べているけど、実際のデータはきれいに1ヶ月単位で並んでいるわけじゃない。
ぐちゃぐちゃなのでそこをどうそろえるかってのが難しかった。

1ヶ月単位で設定できないってのでまずつまった。
元データが1ヶ月単位で並んでいないので、グラフのX軸が開始日と終了日くらいしか出ず。

xfmt = mdates.DateFormatter("%y/%m")
xloc = mdates.DayLocator(bymonthday=[1])
ax.xaxis.set_major_locator(xloc)
ax.xaxis.set_major_formatter(xfmt)

ここで、表示形式をyyyy-mmにして、mdates.DayLocator(bymonthday=[1])で1ヶ月単位で並べるってやってなんとか形にはなった。


次に引っかかったのが、2軸にするためにax = plt.subplot()を使用するんだけど、その場合、ラベルの傾きが設定できない。

ax.set_xticklabelsでやるんだってことは分かったんだけど、普通にplotしている表示ラベルを入れるとラベル数が合わなくてって当たり前。

それを何とかするためにx_axis_label関数を作って1ヶ月単位で表示させるようにした感じ。


一つできればあとは増幅させるだけなので、まあどうってことはない。
今回はファイルのIOがかなりシンプルだったのでそこで躓くことが少なかったってのが良かった。
つーかOUTについて全然考えてないだけだったけど。

グラフのプロット

こんな感じになる。 f:id:snofra:20171110141822p:plain

f:id:snofra:20171110141846p:plain