からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

ハロプロアーティストのアルバムリリース数のバーチャートレースを作ってみた

はじめに

 ハロー!プロジェクトの歴史を可視化しようシリーズ(仮)です。
 この記事では、各アーティストのアルバムリリース数の推移をバーチャートレースにします。

【他の記事】

www.anarchive-beta.com

【目次】

アルバムリリース数の推移の可視化

 ハロー!プロジェクトのアーティストのアルバムリリース数の推移をバーチャートレースで可視化します。

 次のパッケージを利用します。

# 利用パッケージ
library(tidyverse)
library(lubridate)
library(gganimate)

 この記事では、基本的にパッケージ名::関数名()の記法を使うので、パッケージを読み込む必要はありません。
 ただし、パイプ演算子%>%を使うためmagrittrと、作図コードがごちゃごちゃしないようにパッケージ名を省略するためggplot2は読み込む必要があります。

データの読込

 次のページのデータを利用します。

github.com

 GitHub上のcsvデータをRから読み込めたらよかったのですがやり方が分からなかったので、ダウンロードしてローカルフォルダに保存しておきます。

 保存先のフォルダパスを指定します。

# フォルダパスを指定
dir_path <- "data/HP_DB-main/"

 ファイルの読み込み時にファイル名を結合する(ファイルパスにする)ので、末尾を/にしておきます。

 アルバムの情報を読み込みます。

# アルバム一覧を読み込み
album_df <- readr::read_csv(
  file = paste0(dir_path, "album.csv"), 
  col_types = readr::cols(
    albumID = "i", 
    albumName = "c", 
    releaseDate = readr::col_date(format = "%Y/%m/%d"), 
    albumCategory = "c", 
    artistName = "c"
  )
) %>% 
  dplyr::arrange(releaseDate, albumID) # 昇順に並べ替え
album_df
## # A tibble: 200 x 5
##    albumID albumName                        releaseDate albumCategory artistName
##      <int> <chr>                            <date>      <chr>         <chr>     
##  1       1 Teenage Dream                    1998-03-25  オリジナルア~ 平家みちよ
##  2       2 ファーストタイム                 1998-07-08  オリジナルア~ モーニン~ 
##  3       3 モーニング刑事。                 1998-09-30  サウンドトラ~ モーニン~ 
##  4       4 中澤ゆうこ 第一章                1998-12-12  オリジナルア~ 中澤ゆうこ
##  5       5 TANPOPO 1                        1999-03-31  オリジナルア~ タンポポ  
##  6       6 セカンドモーニング               1999-07-28  オリジナルア~ モーニン~ 
##  7       7 Taiyo & Ciscomoon 1              1999-10-27  オリジナルア~ 太陽とシ~ 
##  8       8 3rd -LOVEパラダイス-             2000-03-29  オリジナルア~ モーニン~ 
##  9       9 プッチベスト ~黄青あか~        2000-04-26  ベストアルバ~ ハロー!プ~
## 10      10 映画「ピンチランナー」 オリジナ~ 2000-07-05  サウンドトラ~ モーニン~ 
## # ... with 190 more rows

 album.csvは、アルバムID・アルバム名・リリース日・アルバムカテゴリ・アーティスト名の5列のcsvファイルです。

 このデータを利用して、各アーティストのアルバムリリース数を集計します。

集計用の設定

 集計に関する設定を行います。

期間の設定

 アニメーションとしてグラフ化する(リリース数を集計する)期間を指定します。

# 期間を指定
date_from <- "1998-01-01"
date_to   <- "2022-04-15"
#date_to   <- lubridate::today() %>% 
#  as.character()

 開始日をdate_from、終了日をdate_toとして期間を指定します。文字列でyyyy-mm-ddyyyy/mm/ddyyyymmddなどと指定できます。現在の日付を使う場合は、today()で設定します。ただし、次の処理でベクトルにする際にdate_from, date_toが同じ型である必要があるので、as.character()で文字列にしておきます。

 開始日と終了日をベクトルにまとめます。

# 値をまとめる
date_vals <- c(date_from, date_to) %>% 
  lubridate::as_date() %>% # Date型に変換
  lubridate::floor_date(unit = "mon") # 月単位に切り捨て
date_vals
## [1] "1998-01-01" "2022-04-01"

 文字列型で指定した開始日と終了日を、as_date()でDate型に変換し、さらにfloor_date()unit引数に"mon"を指定して月初の日付にして(日にちを切り捨てて)おきます。

アルバムカテゴリの設定

 アルバムカテゴリを確認します。

# アルバムの種類を確認
unique(album_df[["albumCategory"]])
## [1] "オリジナルアルバム" "サウンドトラック"   "ベストアルバム"    
## [4] "カバーアルバム"     "ミニアルバム"

 5種類のアルバムがあるのが分かります。

 集計に利用するカテゴリを指定します。

# アルバムの種類を指定
album_category <- c("オリジナルアルバム", "ベストアルバム", "ミニアルバム")

 この例では、オリジナルアルバム・ベストアルバム・ミニアルバムのリリース数を集計します。

連名作品の編集

 続いて、アーティスト名を確認します。

# アーティスト名を確認
unique(album_df[["artistName"]])[1:10]
##  [1] "平家みちよ"                "モーニング娘。"           
##  [3] "モーニング娘。&平家みちよ" "中澤ゆうこ"               
##  [5] "タンポポ"                  "太陽とシスコムーン"       
##  [7] "ハロー!プロジェクト"       "T&Cボンバー"              
##  [9] "V.A."                      "市井紗耶香 with 中澤裕子"

 「モーニング娘。&平家みちよ」のような複数アーティストの連名作品や、「月島きらり starring 久住小春(モーニング娘。)」のようにグループ名を含む名義、「中澤ゆうこ」「モーニング娘。'14」「アンジュルム」のような名義変更や改名に対応する必要があります。
 連名作品についてはここで対応します。名義の修正は集計時に行います。

 連名作品のデータを分割(複製)する際に利用するベクトルを作成します(目視で確認しながら頑張って指定します)。

# 連名作品(アルバム名義・分割後の名義・分割数)を指定
pattern_vec <- c("モーニング娘。&平家みちよ", "市井紗耶香 with 中澤裕子", "中澤裕子/メロン記念日/松浦亜弥/石井リカ", "タンポポ/プッチモニ", "中澤裕子/後藤真希/藤本美貴", "モーニング娘。'14/スマイレージ")
replace_vec <- c("モーニング娘。", "平家みちよ", "市井紗耶香", "中澤裕子", "中澤裕子", "メロン記念日", "松浦亜弥", "石井リカ", "中澤裕子", "後藤真希", "藤本美貴", "タンポポ", "プッチモニ", "モーニング娘。'14", "スマイレージ")
n_vec <- c(2, 2, 4, 3, 2, 2)

 分割する必要のあるアーティスト名をpattern_vecに指定します。
 分割後に設定するアーティスト名をreplace_vecに指定します。
 分割(複製)するデータ(行)数をn_vecに指定します。

 例えば、アーティスト名が「モーニング娘。&平家みちよ」のデータを「モーニング娘。」と「平家みちよ」の2行に分割する場合は、pattern_vec"モーニング娘。&平家みちよ"replace_vecc("モーニング娘。", "平家みちよ")n_vec2と指定します。
 pattern_vecn_vecの要素数が一致し、replace_vecの要素数とsum(n_vec)が一致します。

 連名作品のデータを取り出して分割します。

# 連名作品を分割
split_df <- album_df %>% 
  dplyr::filter(artistName %in% pattern_vec) %>% # 連名作品を抽出
  tibble::add_column(n = n_vec) %>% # 複製する数を追加
  tidyr::uncount(n) %>% # 作品を複製
  dplyr::mutate(artistName = replace_vec) # 個々のアーティスト名を設定
split_df
# 連名作品を分割
split_df <- album_df %>% 
  dplyr::filter(artistName %in% pattern_vec) %>% # 連名作品を抽出
  tibble::add_column(n = n_vec) %>% # 複製する数を追加
  tidyr::uncount(n) %>% # 作品を複製
  dplyr::mutate(artistName = replace_vec) # 個々のアーティスト名を設定
split_df

 pattern_vecに含まれるアーティストの行をfilter()%in%演算子で抽出します。
 複製する行数n_vecadd_column()n列として追加して、uncount()で行を複製します。
 アーティスト名をreplace_vecに指定した文字列に置き換えます。

 集計時に、分割前の連名作品のデータをこのデータに置き換えます。

 (メモ:連名作品の名義が重複している場合は上手いことベクトルを設定する必要がある。今のところ重複してないので、ベクトルごとに順番に追加すれば問題なし。)

リリース数の集計と順位付け

 アルバムのリリース数を集計してランキングを付けます。

リリース数の集計

 アーティスト名の編集を行い、アーティストごとにリリース数を集計します。

# アーティスト名を編集してリリース数を集計
release_n_df <- album_df %>% 
  dplyr::filter(!(artistName %in% pattern_vec)) %>% # 連名作品を削除
  dplyr::bind_rows(split_df) %>% # 分割した連名作品を追加
  dplyr::filter(albumCategory %in% album_category) %>% # 指定した種類の作品を抽出
  dplyr::filter(releaseDate >= date_vals[1], releaseDate <= date_vals[2]) %>% # 指定した期間内の作品を抽出
  dplyr::arrange(releaseDate, albumID) %>% # IDの割り当て用に並べ替え
  dplyr::mutate(
    release_date = lubridate::floor_date(releaseDate, unit = "mon"), # 月単位に切り捨て
    artist_name = artistName %>% # グラフ表示名を追加
      #stringr::str_replace(pattern = "℃-ute", replacement = "C-ute") %>% # 作図時に豆腐化するので代用
      stringr::str_replace(pattern = "月島きらり.*", replacement = "月島きらり(久住小春)") %>% # 長いので省略
      stringr::str_replace(pattern = "太陽とシスコムーン/T&Cボンバー", replacement = "太陽とシスコムーン"), # 改名前に変更
    artist_idname = artist_name %>% # IDの割り当て用に編集
      stringr::str_replace(pattern = "モーニング娘。.*", replacement = "モーニング娘。") %>% # ナンバリングを削除
      stringr::str_replace(pattern = "中澤ゆうこ", replacement = "中澤裕子") %>% # ソロ用名義を名前に統一
      stringr::str_replace(pattern = "T&Cボンバー", replacement = "太陽とシスコムーン") %>% # 改名前に統一
      stringr::str_replace(pattern = "アンジュルム", replacement = "スマイレージ"), # 改名前に統一
    artist_idname = factor(artist_idname, levels = unique(artist_idname)), # レベル設定のため因子型に変換
    artist_id = dplyr::dense_rank(artist_idname) # アーティストIDを追加
  ) %>% # アーティスト名を編集
  dplyr::count(release_date, artist_id, artist_name, name = "release_n") %>% # リリース数をカウント:(同じ月にIDが一緒で名前が異なる作品があるとたぶんバグる)
  dplyr::group_by(artist_id) %>% # 累積和の計算用にグループ化
  dplyr::mutate(release_n = cumsum(release_n)) %>% # リリース数の累積和を計算
  dplyr::arrange(release_date, artist_id) %>% # 複製数の追加用に並べ替え
  dplyr::group_by(artist_id) %>% # 複製数の追加用にグループ化
  dplyr::mutate(
    next_release_date = release_date %>% 
      dplyr::lead(n = 1) %>% # 1行前に値をズラす
      tidyr::replace_na(
        replace = lubridate::today() %>% 
          lubridate::rollforward(roll_to_first = TRUE)
      ), # 最後の行を現在の翌月にする
    n = lubridate::interval(start = release_date, end = next_release_date) %>% 
      lubridate::time_length(unit = "mon") # リリース数がない期間の月数を追加
  ) %>% 
  tidyr::uncount(n) %>% # 月数に応じて行を複製
  dplyr::group_by(release_date, artist_id) %>% # 行番号用にグループ化
  dplyr::mutate(idx = dplyr::row_number()) %>% # 行番号を割り当て
  dplyr::group_by(release_date, artist_id, idx) %>% # 1か月刻みの値の作成用にグループ化
  dplyr::mutate(date = seq(from = release_date, to = next_release_date, by = "mon")[idx]) %>% # 複製した行を1か月刻みの値に変更
  dplyr::ungroup() %>% # グループ化を解除
  dplyr::select(date, artist_id, artist_name, release_n) %>% # 利用する列を選択
  dplyr::arrange(date, artist_id) # 昇順に並べ替え
release_n_df
## # A tibble: 6,836 x 4
##    date       artist_id artist_name    release_n
##    <date>         <int> <chr>              <int>
##  1 1998-03-01         1 平家みちよ             1
##  2 1998-04-01         1 平家みちよ             1
##  3 1998-05-01         1 平家みちよ             1
##  4 1998-06-01         1 平家みちよ             1
##  5 1998-07-01         1 平家みちよ             1
##  6 1998-07-01         2 モーニング娘。         1
##  7 1998-08-01         1 平家みちよ             1
##  8 1998-08-01         2 モーニング娘。         1
##  9 1998-09-01         1 平家みちよ             1
## 10 1998-09-01         2 モーニング娘。         1
## # ... with 6,826 more rows

 先ほどは、pattern_vecに指定したアーティストをfilter()%in%演算子で抽出しました。ここでは、!TRUEFALSEを入れ替えて、pattern_vecに含まれないアーティストのデータを抽出します。
 連名作品を除去したので、分割した連名作品split_dfbind_rows()で結合します。
 集計期間date_valsに発売されたデータを抽出します。

 「グラフに表示する用のアーティスト名列artist_name」と「集計用(ID割り当て用)のアーティスト名列artist_idname」を作成します。
 表示名では、例えば「月島きらり starring 久住小春(モーニング娘。)」を「月島きらり(久住小春)」のように書き換えます。
 集計用名では、例えば「モーニング娘。'14」を「モーニング娘。」、「アンジュルム」を「スマイレージ」のように書き換えて、同一アーティストの名前を統一します。
 各集計用名に対してdense_rank()で通し番号を割り当てて、アーティストID列artist_idとします。
 IDの割り当て前に、artist_idname列を因子型に変換してレベルを設定しておくと、IDの割り当て順を指定できます。この例では、1枚目の発売が早い順(同月ならアルバムIDが小さい順)になります。因子型にしない場合は、文字列の基準で昇順になります。

 「発売月・ID・名前」が同じ行数をcount()でカウントして、リリース数列release_nとします。
 さらに、cumsum()で累積和を計算して、各月までの合計リリース数を求めます。

 ここまでで、発売された月のデータを用意できました。続いて、発売のなかった月のデータを作成します。
 処理がややこしいので、下の簡単な例を使って解説します。

 3か月間隔の日付を作成して、i行目とi+1行目の月数を調べます。

df1 <- tibble::tibble(
  date = seq(
    from = lubridate::as_date("2020-04-01"), 
    to = lubridate::as_date("2022-03-01"), 
    by = "3 months"
  )
) %>% 
  dplyr::mutate(
    next_date = date %>% 
      dplyr::lead(n = 1) %>% # 1行前にズラす
      tidyr::replace_na(
        replace = lubridate::today() %>% 
          lubridate::rollforward(roll_to_first = TRUE)
      ), # 最後の行を翌月にする
    n = lubridate::interval(start = date, end = next_date) %>% 
      lubridate::time_length(unit = "month") # i行目とi+1行目の月数を追加
  )
df1
## # A tibble: 8 x 3
##   date       next_date      n
##   <date>     <date>     <dbl>
## 1 2020-04-01 2020-07-01     3
## 2 2020-07-01 2020-10-01     3
## 3 2020-10-01 2021-01-01     3
## 4 2021-01-01 2021-04-01     3
## 5 2021-04-01 2021-07-01     3
## 6 2021-07-01 2021-10-01     3
## 7 2021-10-01 2022-01-01     3
## 8 2022-01-01 2022-06-01     5

 seq()by引数に"3 months"を指定して3か月間隔の日付を作成して、発売月の代わりの列dateとします。
 date列を1行前にズラした列をlead()で作成して、next_dateとします。最後の行が欠損値になるので、replace_na()で置き換えます。today()rollfoward()で現在の日付の翌月にします。
 dateからnext_dateまでの月数をinterval()time_lenght()で調べて、n列とします。

 行を複製して、1か月間隔となるように日付を再設定します。

df2 <- df1 %>% 
  tidyr::uncount(n) %>% # 月数に応じて行を複製
  dplyr::group_by(date) %>% # 行番号用にグループ化
  dplyr::mutate(idx = dplyr::row_number()) %>% # 行番号を割り当て
  dplyr::group_by(date, idx) %>% # 1か月刻みの値の作成用にグループ化
  dplyr::mutate(new_date = seq(from = date, to = next_date, by = "month")[idx]) %>% # 複製した行を1か月刻みの値に変更
  dplyr::ungroup() # グループ化を解除
df2
## # A tibble: 26 x 4
##    date       next_date    idx new_date  
##    <date>     <date>     <int> <date>    
##  1 2020-04-01 2020-07-01     1 2020-04-01
##  2 2020-04-01 2020-07-01     2 2020-05-01
##  3 2020-04-01 2020-07-01     3 2020-06-01
##  4 2020-07-01 2020-10-01     1 2020-07-01
##  5 2020-07-01 2020-10-01     2 2020-08-01
##  6 2020-07-01 2020-10-01     3 2020-09-01
##  7 2020-10-01 2021-01-01     1 2020-10-01
##  8 2020-10-01 2021-01-01     2 2020-11-01
##  9 2020-10-01 2021-01-01     3 2020-12-01
## 10 2021-01-01 2021-04-01     1 2021-01-01
## # ... with 16 more rows

 各行をuncount()n行に複製します。
 複製した行ごとにグループ化して、row_number()で行番号を割り当てます。
 dateからnext_dateの月ベクトルを作成して、行番号に応じて値を取り出します。
 ここでは分かりやすいように、作成した月列をnew_dateとしました。実際には、date列を上書きします。

 以上で、月ごとに、各アーティストの合計リリース数のデータが得られました。

演出用の処理

 バーの変化(アニメーション)を強調するために、期間内における1枚目の発売1か月前のデータ(リリース数が0のデータ)を作成します。

 各アーティストの「1枚目の発売1か月前」のデータフレームを作成します。

# 1枚目のリリース前月のデータを作成
release_0_df <- release_n_df %>% 
  dplyr::group_by(artist_id) %>% # 1枚目の抽出用にグループ化
  dplyr::filter(date == min(date)) %>% # 1枚目を抽出
  dplyr::ungroup() %>% # グループ化を解除
  dplyr::mutate(
    date = date %>% 
      lubridate::rollback() %>% 
      lubridate::floor_date(unit = "mon"), 
    artist_name = " ", 
    release_n = 0
  ) %>% # 1か月前のデータに書き換え
  dplyr::filter(date >= date_vals[1], date <= date_vals[2]) # 指定した期間内のデータを抽出
release_0_df
## # A tibble: 36 x 4
##    date       artist_id artist_name release_n
##    <date>         <int> <chr>           <dbl>
##  1 1998-02-01         1 " "                 0
##  2 1998-06-01         2 " "                 0
##  3 1998-11-01         3 " "                 0
##  4 1999-02-01         4 " "                 0
##  5 1999-09-01         5 " "                 0
##  6 2000-03-01         6 " "                 0
##  7 2001-03-01         7 " "                 0
##  8 2001-11-01         8 " "                 0
##  9 2001-12-01         9 " "                 0
## 10 2002-05-01        10 " "                 0
## # ... with 26 more rows

 編集と集計を行ったデータrelease_n_dfから、アーティストごとに、日付列dateが最小の行をfilter()で抽出します。
 date列が1枚目の発売月になるので、rollback()floor_date()で1か月前の日付にします。
 発売前のデータとして、アーティスト名を半角スペース" "、リリース数を0にします。
 集計期間date_vals内のデータをfilter()で抽出します。

リリース数の順位付け

 各月における「リリース数」と「順位」のデータフレームを作成します。

# 描画する順位を指定
max_rank <- 50

# リリース数で順位付け
rank_df <- dplyr::bind_rows(release_0_df, release_n_df) %>% # 発売前月のデータを追加:(小細工する場合)
  dplyr::arrange(date, artist_id) %>% # 昇順に並び替え
  dplyr::group_by(date) %>% # 月でグループ化
  dplyr::mutate(
    artist_id = factor(artist_id),  # 作図用に因子型に変換
    ranking = dplyr::row_number(-release_n) # ランキング列を追加
  ) %>% 
  dplyr::ungroup() %>% # グループ化を解除
  dplyr::filter(ranking <= max_rank) %>% # ランク上位グループを抽出
  dplyr::arrange(date, ranking) # 昇順に並べ替え
rank_df
## # A tibble: 6,872 x 5
##    date       artist_id artist_name      release_n ranking
##    <date>     <fct>     <chr>                <dbl>   <int>
##  1 1998-02-01 1         " "                      0       1
##  2 1998-03-01 1         "平家みちよ"             1       1
##  3 1998-04-01 1         "平家みちよ"             1       1
##  4 1998-05-01 1         "平家みちよ"             1       1
##  5 1998-06-01 1         "平家みちよ"             1       1
##  6 1998-06-01 2         " "                      0       2
##  7 1998-07-01 1         "平家みちよ"             1       1
##  8 1998-07-01 2         "モーニング娘。"         1       2
##  9 1998-08-01 1         "平家みちよ"             1       1
## 10 1998-08-01 2         "モーニング娘。"         1       2
## # ... with 6,862 more rows

 リリース前のデータrelease_0_dfとリリース数のデータrelease_n_dfbind_rows()で結合します。
 バーの色分け用に、アーティストIDを因子型に変換します。
 row_number()でリリース数に応じて順位を付けて、ranking列とします。指定した列を昇順にして通し番号が割り当てられるので、-を付けて大小関係を反転させます。
 描画する順位を指定しておき、上位のデータをfilter()で抽出します。

 以上で、必要なデータを得られました。次は、作図を行います。

推移の可視化

 リリース数と順位を棒グラフで可視化します。

バーチャートレースの作成

 アルバムリリース数の推移をバーチャートレースで可視化します。バーチャートレースの作図については「【R】バーチャートレースのアニメーションの作図【gganimate】 - からっぽのしょこ」を参照してください。

 フレームに関する値を指定します。

# 遷移フレーム数を指定
t <- 8

# 一時停止フレーム数を指定
s <- 2

# 1秒間に表示する月数を指定:(値が大きいと意図した通りにならない)
mps <- 3

# フレーム数を取得
n <- length(unique(rank_df[["date"]]))
n
## [1] 292

 現月と次月のグラフを繋ぐアニメーションのフレーム数をtとして、整数を指定します。
 各月のグラフで一時停止するフレーム数をsとして、整数を指定します。
 基本となるフレーム数(月の数)をnとします。

 バーチャートレースを作成します。

# バーチャートレースを作成:(y軸可変)
anim <- ggplot(rank_df, aes(x = ranking, y = release_n, fill = artist_id, color = artist_id)) + 
  geom_bar(stat = "identity", width = 0.9, alpha = 0.8) + # リリース数のバー
  geom_text(aes(y = 0, label = paste(artist_name, " ")), hjust = 1) + # アーティスト名のラベル
  geom_text(aes(label = paste(" ", round(release_n, 0), "枚")), hjust = 0) + # リリース数のラベル
  gganimate::transition_states(states = date, transition_length = t, state_length = s, wrap = FALSE) + # フレーム
  gganimate::ease_aes("cubic-in-out") + # アニメーションの緩急
  theme(
    axis.title.x = element_blank(), # x軸のラベル
    axis.title.y = element_blank(), # y軸のラベル
    axis.text.x = element_blank(), # x軸の目盛ラベル
    axis.text.y = element_blank(), # y軸の目盛ラベル
    axis.ticks.x = element_blank(), # x軸の目盛指示線
    axis.ticks.y = element_blank(), # y軸の目盛指示線
    #panel.grid.major.x = element_line(color = "grey", size = 0.1), # x軸の主目盛線
    panel.grid.major.y = element_blank(), # y軸の主目盛線
    #panel.grid.minor.x = element_blank(), # x軸の補助目盛線
    panel.grid.minor.y = element_blank(), # y軸の補助目盛線
    panel.border = element_blank(), # グラフ領域の枠線
    #panel.background = element_blank(), # グラフ領域の背景
    plot.title = element_text(color = "black", face = "bold", size = 20, hjust = 0.5), # 全体のタイトル
    plot.subtitle = element_text(color = "black", size = 15, hjust = 0.5), # 全体のサブタイトル
    plot.margin = margin(t = 10, r = 50, b = 10, l = 150, unit = "pt"), # 全体の余白
    legend.position = "none" # 凡例の表示位置
  ) + # 図の体裁
  coord_flip(clip = "off", expand = FALSE) + # 軸の入れ変え
  scale_x_reverse() + # x軸を反転
  gganimate::view_follow(fixed_x = TRUE) + # 表示範囲の調整
  labs(
    title = paste0(
      "ハロプロアーティストのアルバムリリース数の推移", 
      ":(", lubridate::year(date_from), "年", lubridate::month(date_from), "月以降)"
    ), 
    subtitle = "{lubridate::year(closest_state)}年{lubridate::month(closest_state)}月", 
    caption = "データ:「https://github.com/xxgentaroxx/HP_DB」"
  ) # ラベル

 y軸を最大値で固定して描画します。

 animate()でgif画像を作成します。

# gif画像を作成
g <- gganimate::animate(
  plot = anim, 
  nframes = n*(t+s), fps = (t+s)*mps, 
  width = 900, height = 800
)
g

 plot引数にグラフ、nframes引数にフレーム数、fps引数に1秒当たりのフレーム数を指定します。

 (ファイルサイズの上限は越えてないんだけどアップロードできなかったので完成例は省略します。)

 anim_save()でgif画像を保存します。

# gif画像を保存
gganimate::anim_save(filename = "output/AlbumNum.gif", animation = g)

 filename引数にファイルパス("(保存する)フォルダ名/(作成する)ファイル名.gif")、animation引数に作成したgif画像を指定します。

 動画を作成する場合は、renderer引数を指定します。

# 動画を作成と保存
m <- gganimate::animate(
  plot = anim, 
  nframes = n*(t+s)+e, end_pause = e, fps = (t+s)*mps, 
  width = 900, height = 800, 
  renderer = gganimate::av_renderer(file = "output/AlbumNum.mp4")
)

 renderer引数に、レンダリング方法に応じた関数を指定します。この例では、av_renderer()を使います。
 av_renderer()file引数に保存先のファイルパス("(保存する)フォルダ名/(作成する)ファイル名.mp4")を指定します。

 (記事に動画を貼れないのでこれで代用します。)
 上の図は、全てのデータを利用したものなので、全てのアーティストの1stアルバムから集計しています。下の図は、2014年1月以降にリリースされたアルバム数です。

月を指定して作図

 最後に、指定した月のリリース数のグラフを作成します。

# 月を指定
date_val <- "2021-05-01"

# 棒グラフを作成
graph <- rank_df %>% 
  dplyr::filter(date == lubridate::as_date(date_val)) %>% 
  ggplot(aes(x = ranking, y = release_n, fill = artist_id, color = artist_id)) + 
  geom_bar(stat = "identity", width = 0.9, alpha = 0.8) + # リリース数のバー
  geom_text(aes(y = 0, label = paste(artist_name, " ")), hjust = 1) + # グループ名のラベル
  geom_text(aes(y = 0, label = paste(" ", release_n, "枚")), hjust = 0, color = "white") + # リリース数のラベル
  theme(
    axis.title.y = element_blank(), # y軸のラベル
    axis.text.y = element_blank(), # y軸の目盛ラベル
    #panel.grid.major.x = element_line(color = "grey", size = 0.1), # x軸の主目盛線
    panel.grid.major.y = element_blank(), # y軸の主目盛線
    panel.grid.minor.x = element_blank(), # x軸の補助目盛線
    panel.grid.minor.y = element_blank(), # y軸の補助目盛線
    panel.border = element_blank(), # グラフ領域の枠線
    #panel.background = element_blank(), # グラフ領域の背景
    plot.title = element_text(color = "black", face = "bold", size = 20, hjust = 0.5), # 全体のタイトル
    plot.subtitle = element_text(color = "black", size = 15, hjust = 0.5), # 全体のサブタイトル
    plot.margin = margin(t = 10, r = 20, b = 10, l = 125, unit = "pt"), # 全体の余白
    legend.position = "none" # 凡例の表示位置
  ) + # 図の体裁
  coord_flip(clip = "off", expand = FALSE) + # 軸の入れ変え
  scale_x_reverse(breaks = 1:max(rank_df[["ranking"]])) + # x軸を反転
  labs(
    title = paste0(
      "ハロプロアーティストのアルバムリリース数", 
      ":(", lubridate::year(date_from), "年", lubridate::month(date_from), "月以降)"
    ), 
    subtitle = paste0(lubridate::year(date_val), "年", lubridate::month(date_val), "月時点"), # ラベル
    y = "リリース数", 
    caption = "データ:「https://github.com/xxgentaroxx/HP_DB」"
  ) # ラベル
graph


 ggsave()で画像を保存できます。

# 画像を保存
ggplot2::ggsave(
  filename = paste0("output/AlbumNum_", date_val, ".png"), plot = graph, 
  width = 24, height = 18, units = "cm", dpi = 100
)

アルバムリリース数のグラフ

 以上で、アルバムリリース数の推移を可視化できました。

おわりに

 2つ目を書きました。現時点であと3種類組んであるのですが、早く記事(メモ)化しないと何のための処理なのかどんどん忘れてしまう。。。