からっぽのしょこ

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

ハロプロ研修生の歴代メンバーの活動期間のタイムラインチャートを作ってみた

はじめに

 ハロー!プロジェクトの歴史を可視化しようシリーズ(仮)です。
 この記事では、ハロプロキッズ・エッグ・研修生の歴代メンバーの活動期間をタイムラインにします。

【他の記事】

www.anarchive-beta.com

【目次】

研修生の活動期間の可視化

 ハロー!プロジェクトキッズ・エッグ・研修生・研修生北海道の歴代メンバーの活動期間をタイムラインチャートで可視化します。

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

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

 この記事では、基本的にパッケージ名::関数名()の記法を使うので、パッケージを読み込む必要はありません。ただし、作図コードがごちゃごちゃしないようにパッケージ名を省略しているため、ggplot2は読み込む必要があります。
 magrittrパッケージのパイプ演算子%>%ではなく、ベースパイプ(ネイティブパイプ)演算子|>を使っています。%>%に置き換えても処理できます。

データの読込

 「GitHub - xxgentaroxx/HP_DB: 歴代ハロプロメンバーの移り変わり」のデータを利用します。詳しくは「ハロプログループの歴代メンバーの活動期間のタイムラインチャートを作ってみた - からっぽのしょこ」を参照してください。

タイムラインによる可視化

 メンバーごとのタイムラインチャートを作成します。

前処理

 まずは、集計する際に利用するデータを用意します。

 メンバーデータを作成します。

# 重複データを削除
member_df2 <- member_df |> 
  dplyr::select(memberID, memberName, HPjoinDate, birthDate) |> # 利用する列を取得
  dplyr::group_by(memberID) |> # 重複の除去用にグループ化
  dplyr::mutate(HPjoinDate = min(HPjoinDate)) |> # 古い方のハロプロ加入日に統一
  dplyr::slice_tail(n = 1) |> # 新しい方のデータを抽出
  dplyr::ungroup() # グループ化を解除
member_df2
## # A tibble: 272 × 4
##    memberID memberName HPjoinDate birthDate 
##       <int> <chr>      <date>     <date>    
##  1        1 中澤裕子   1997-09-14 1973-06-19
##  2        2 石黒彩     1997-09-14 1978-05-12
##  3        3 飯田圭織   1997-09-14 1981-08-08
##  4        4 安倍なつみ 1997-09-14 1981-08-10
##  5        5 福田明日香 1997-09-14 1984-12-17
##  6        6 平家みちよ 1997-11-05 1979-04-06
##  7        7 保田圭     1998-05-03 1980-12-06
##  8        8 矢口真里   1998-05-03 1983-01-20
##  9        9 市井紗耶香 1998-05-03 1983-12-31
## 10       10 信田美帆   1999-02-21 1972-05-18
## # … with 262 more rows

 メンバー情報(member_df)からメンバーID(memberID列)・名前(menberName列)・ハロプロ加入日(HPjoinDate列)・誕生日(birthDate列)を抽出します。
 改名メンバーなどのデータが重複するため、slice_tail()で改名後のデータ(行)を抽出します。ただし、HPjoinDate列が改名日になってしまうので、加入日(最小値)に変更しておきます。\

 グループデータからユニットを除いたグループIDを抽出します。

# グループIDを抽出
groupID_vec <- group_df |> 
  dplyr::filter(isUnit == FALSE) |> # ユニットを除去
  dplyr::pull(groupID) |> # ベクトルとして取得
  unique() # 重複を削除
groupID_vec
##  [1]  1  3  4  5  7  9 10 16 18 19 20 22 23 29 30 33 34 36 37 38 39 40 44

 グループ情報(group_df)からユニット(isUnit列がTRUE)ではないグループ(行)を抽出します。チャートにユニットを含める場合は不要です。

 グループIDとグループ名を対応するデータフレームを作成します。

# グループIDとグループ名の対応表を作成
groupName_df <- group_df |> 
  dplyr::mutate(
    groupName = groupName |> 
      stringr::str_replace(pattern = "S/mileage", replacement = "スマイレージ") # 改名後に変更
  ) |> 
  dplyr::group_by(groupID) |> # 重複の削除用にグループ化
  #dplyr::filter(formDate == min(formDate)) |> # 改名前に統一
  dplyr::filter(formDate == max(formDate)) |> # 改名後に統一
  dplyr::ungroup() |> # グループ化を解除
  dplyr::select(groupID, groupName) # 利用する列を選択
groupName_df
## # A tibble: 44 × 2
##    groupID groupName                  
##      <int> <chr>                      
##  1       1 モーニング娘。 '22         
##  2       2 タンポポ                   
##  3       3 T&Cボンバー                
##  4       4 ココナッツ娘。             
##  5       5 カントリー・ガールズ       
##  6       6 プッチモニ                 
##  7       7 メロン記念日               
##  8       8 ミニモニ。                 
##  9       9 シェキドル                 
## 10      10 ハロー!プロジェクト・キッズ
## # … with 34 more rows

 グループ情報(group_df)からグループID(groupID列)とグループ名(groupName列)を抽出します。
 全てのグループで、初期のグループ名を使う場合は結成日(formDate列)が最小のデータ(行)、改名後を使う場合は最大のデータ(行)を抽出します。必要に応じて、グループ名(groupName列)を変更しておきます。

期間の設定

 次に、集計開始日と終了日を指定します。

# 集計開始日を指定
#date_from <- lubridate::as_date("2002-06-30") # キッズ誕生
date_from <- lubridate::as_date("2004-08-10") # エッグ誕生
#date_from <- lubridate::as_date("2011-12-01") # 研修生誕生
#date_from <- lubridate::as_date("2017-01-01")

# 集計終了日を指定
#date_to <- lubridate::as_date("2005-06-10") # キッズ終了
date_to <- lubridate::as_date("2011-11-30") # エッグ終了
#date_to <- lubridate::as_date("2016-12-31")
#date_to <- lubridate::today() # 現在の日付

 指定した期間にキッズ・エッグ・研修生だったメンバーを可視化対象とします。

活動期間の集計:(加入日・卒業日)

 続いて、設定した期間にハロプロキッズ・エッグ・研修生に在籍したメンバーのデータと、その後デビューしたグループでの現在までの活動期間のデータを作成します。

 指定した期間において研修生等に在籍していたメンバーのデータを作成します。

# エッグ・研修生のデータを作成
join_kenshu_df <- join_df |> 
  dplyr::filter(groupID %in% c(10, 18, 39)) |> # キッズ・エッグ・研修生メンバーを抽出
  dplyr::mutate(
    gradDate = dplyr::if_else(
      is.na(gradDate), true = lubridate::today(), false = gradDate
    )
  ) |> # 現在活動中であれば現在の日付を設定
  dplyr::filter(joinDate >= date_from, joinDate <= date_to) |> # 指定した期間内の在籍メンバーを抽出
  dplyr::arrange(joinDate, memberID) |> # IDの再設定用に並べ替え
  dplyr::mutate(member_id = dplyr::row_number()) |> # メンバーIDを再設定
  dplyr::left_join(member_df2, by = "memberID") # メンバー情報を結合
join_kenshu_df
## # A tibble: 56 × 8
##    memberID groupID joinDate   gradDate   member_id memberName     HPjoinDate
##       <int>   <int> <date>     <date>         <int> <chr>          <date>    
##  1       67      18 2004-08-10 2006-01-01         1 有原栞菜       2004-08-10
##  2       69      18 2004-08-10 2006-08-01         2 諸塚香奈実     2004-08-10
##  3       70      18 2004-08-10 2006-08-01         3 橋本愛奈       2004-08-10
##  4       71      18 2004-08-10 2006-08-01         4 秋山ゆりか     2004-08-10
##  5       72      18 2004-08-10 2006-09-30         5 大瀬楓         2004-08-10
##  6       73      18 2004-08-10 2006-09-30         6 岡田ロビン翔子 2004-08-10
##  7       74      18 2004-08-10 2006-09-30         7 後藤夕貴       2004-08-10
##  8       75      18 2004-08-10 2008-01-29         8 是永美記       2004-08-10
##  9       76      18 2004-08-10 2009-09-23         9 能登有沙       2004-08-10
## 10       77      18 2004-08-10 2010-03-27        10 和田彩花       2004-08-10
## # … with 46 more rows, and 1 more variable: birthDate <date>

 グループ加入・卒業情報(join_df)から必要なデータを抽出します。

 キッズ・エッグと研修生・研修生北海道それぞれのグループID(10, 18, 39)のデータ(行)を抽出します。
 現在活動期間中のメンバーであれば卒業日(gradDate列)が欠損値NAなので、現在の日付に変更します。
 指定した期間内のデータ(行)を抽出します。
 新たなメンバーIDとして通し番号を割り当てます。ラインチャートのプロット位置としてこの値を利用します。

 デビューしたメンバーのデータを作成します。

# エッグ・研修生からデビューしたメンバーを作成
join_debut_df <- join_df |> 
  dplyr::filter(
    memberID %in% join_kenshu_df[["memberID"]], !(groupID %in% c(10, 18, 39)), groupID %in% groupID_vec # (ユニットを含めない場合)
    #memberID %in% join_kenshu_df[["memberID"]], !(groupID %in% c(10, 18, 39)) # (ユニットを含める場合)
  ) |> # 研修生からデビューしたメンバーを抽出
  dplyr::mutate(
    gradDate = dplyr::if_else(
      is.na(gradDate), true = lubridate::today(), false = gradDate
    )
  ) |> # 現在活動中であれば現在の日付を設定
  dplyr::left_join(
    join_kenshu_df |> 
      dplyr::select(memberID, member_id), 
    by = "memberID"
  ) |> # 再設定したメンバーIDを結合
  dplyr::left_join(member_df2, by = "memberID") |> # メンバー情報を結合
  dplyr::arrange(member_id) # 昇順に並べ替え
join_debut_df
## # A tibble: 23 × 8
##    memberID groupID joinDate   gradDate   member_id memberName     HPjoinDate
##       <int>   <int> <date>     <date>         <int> <chr>          <date>    
##  1       67      20 2006-01-02 2009-07-09         1 有原栞菜       2004-08-10
##  2       69      22 2006-08-02 2007-09-30         2 諸塚香奈実     2004-08-10
##  3       70      22 2006-08-02 2007-09-30         3 橋本愛奈       2004-08-10
##  4       71      22 2006-08-02 2007-09-30         4 秋山ゆりか     2004-08-10
##  5       72      22 2006-10-01 2007-09-30         5 大瀬楓         2004-08-10
##  6       73      22 2006-10-01 2007-09-30         6 岡田ロビン翔子 2004-08-10
##  7       74      22 2006-10-01 2007-09-30         7 後藤夕貴       2004-08-10
##  8       77      33 2009-04-04 2019-06-18        10 和田彩花       2004-08-10
##  9       78      33 2009-04-04 2011-12-31        11 前田憂佳       2004-08-10
## 10       79      33 2009-04-04 2015-11-29        12 福田花音       2004-08-10
## # … with 13 more rows, and 1 more variable: birthDate <date>

 指定した期間内のメンバー(メンバーIDがjoin_kenshu_dfmemberID列に含まれる)で、グループに加入した(グループIDがgroupID_vecに含まれる)メンバー(行)を抽出します。ただし、研修生等(グループIDが10, 18, 39)場合は除きます。
 現在活動期間中のメンバーであれば卒業日(gradDate列)が欠損値NAなので、現在の日付に変更します。
 プロット用メンバーID(join_kenshu_dfmember_id列)をそれぞれ結合します。

 抽出したメンバーの加入日と卒業日における年齢と活動日数を計算します。

# メンバーごとに加入日・卒業日における年齢と活動日数を計算
chart_df <- dplyr::bind_rows(join_kenshu_df, join_debut_df) |> # デビュー前・後のデータを結合
  # データの整形
  tidyr::pivot_longer(
    cols = c(joinDate, gradDate), 
    names_to = "date_type", 
    values_to = "date"
  ) |> # 加入日・卒業日の列をまとめる
  dplyr::left_join(groupName_df, by = "groupID") |> # グループ名を結合
  dplyr::select(date, date_type, groupID, groupName, member_id, memberName, HPjoinDate, birthDate) |> # 利用する列を選択
  dplyr::arrange(date, member_id) |> # 昇順に並べ替え
  # メンバー情報を編集
  dplyr::mutate(
    age = lubridate::interval(start = birthDate, end = date) |> 
      lubridate::time_length(unit = "year") |> 
      floor(), # 年齢を計算
    act_y = lubridate::interval(start = HPjoinDate, end = date) |> 
      lubridate::time_length(unit = "year") |> 
      floor(), # 活動年数を計算
    act_m = lubridate::interval(start = HPjoinDate, end = date) |> 
      lubridate::time_length(unit = "mon") |> 
      floor() %% 12, # 活動月数-年数を計算
    act_d = dplyr::case_when(
      lubridate::day(date) == lubridate::day(HPjoinDate) ~ 0, # 日にちが同じなら、0
      lubridate::day(date) > lubridate::day(HPjoinDate) ~ lubridate::day(date) - lubridate::day(HPjoinDate) |> 
        as.numeric(), # 加入時の日にちが大きいなら、日にちの差
      all(
        lubridate::day(date) < lubridate::day(HPjoinDate), 
        lubridate::day(lubridate::rollback(date)) < lubridate::day(HPjoinDate)
      ) ~ lubridate::interval(
        start = date |> 
          lubridate::rollback(), # 前月の末日に変更
        end = date
      ) |> 
        lubridate::time_length(unit = "day"), # 卒業時の日にちが大きく前月に加入時の日にちが存在しない月なら、前月の末日との差
      lubridate::day(date) < lubridate::day(HPjoinDate) ~ lubridate::interval(
        start = date |> 
          lubridate::rollback() |> # 1か月前の末日に変更
          lubridate::floor_date(unit = "mon") + lubridate::day(HPjoinDate) - 1, # 加入時と同じ日にちに変更
        end = date
      ) |> 
        lubridate::time_length(unit = "day") # 卒業時の日にちが大きいなら、前月の加入時と同じ日にちとの差
    ), # 活動日数-年月数を計算
    act_days = lubridate::interval(start = HPjoinDate, end = date) |> 
      lubridate::time_length(unit = "day"), # 活動日数を計算
    label = paste0(age, "歳:", act_y, "年", act_m, "か月", act_d, "日")
  ) |> # ラベル用の値を計算
  dplyr::select(date, groupID, groupName, member_id, memberName, age, act_y, act_m, act_d, act_days, label) |> # 利用する列を選択
  dplyr::arrange(date, groupID) |> # 因子レベルの設定用に並べ替え
  dplyr::group_by(member_id) |> # プロット位置の調整用にグループ化
  dplyr::mutate(
    groupName = factor(groupName, levels = unique(groupName)), # 色分け用に因子型に変換
    join_grad_sort = factor(groupID, levels = unique(groupID)) |> # レベル設定
      dplyr::dense_rank(), # 加入順を追加
    diff_flg = any(join_grad_sort != sort(join_grad_sort)), # 兼任期間の有無を判定
    diff = dplyr::if_else(
      diff_flg, true = join_grad_sort-1, false = 0
    ), # 兼任期間がある場合は
    diff = diff - median(diff), # プロット位置の調整用の値を計算
    id_label = stringr::str_c("member ", member_id, ":group ", groupID) |> 
      as.factor()
  ) |> 
  dplyr::ungroup() |> # グループ化を解除
  dplyr::select(date, groupID, groupName, member_id, memberName, age, act_y, act_m, act_d, id_label, diff) |> # 利用する列を選択
  dplyr::arrange(date, member_id, groupID) # 昇順に並べ替え
chart_df
## # A tibble: 158 × 11
##    date       groupID groupName     member_id memberName   age act_y act_m act_d
##    <date>       <int> <fct>             <int> <chr>      <dbl> <dbl> <dbl> <dbl>
##  1 2004-08-10      18 ハロプロ研修…         1 有原栞菜      11     0     0     0
##  2 2004-08-10      18 ハロプロ研修…         2 諸塚香奈実    14     0     0     0
##  3 2004-08-10      18 ハロプロ研修…         3 橋本愛奈      11     0     0     0
##  4 2004-08-10      18 ハロプロ研修…         4 秋山ゆりか    11     0     0     0
##  5 2004-08-10      18 ハロプロ研修…         5 大瀬楓        13     0     0     0
##  6 2004-08-10      18 ハロプロ研修…         6 岡田ロビ…     11     0     0     0
##  7 2004-08-10      18 ハロプロ研修…         7 後藤夕貴      11     0     0     0
##  8 2004-08-10      18 ハロプロ研修…         8 是永美記      18     0     0     0
##  9 2004-08-10      18 ハロプロ研修…         9 能登有沙      15     0     0     0
## 10 2004-08-10      18 ハロプロ研修…        10 和田彩花      10     0     0     0
## # … with 148 more rows, and 2 more variables: id_label <fct>, diff <dbl>

 研修生等とグループ在籍時のデータを結合して、加入日と卒業日の列をまとめます。
 グループ名を結合します。
 メンバーラベルとして利用するために、加入時・卒業時における年齢と活動年数を計算します。
 プロット位置の調整用の値を作成します。

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

タイムラインチャートの作図

 x軸目盛用の値を作成します。

# x軸の値(年)を作成
date_vec <- seq(
  from = chart_df[["date"]] |> 
    min() |> 
    lubridate::floor_date(unit = "year"), # 年単位で切り捨て
  to = chart_df[["date"]] |> 
    max() |> 
    lubridate::ceiling_date(unit = "year"), # 年単位で切り上げ
  by = "year"
)
head(date_vec)
## [1] "2004-01-01" "2005-01-01" "2006-01-01" "2007-01-01" "2008-01-01"
## [6] "2009-01-01"

 chart_dfdate列の最小値をfloor_date()で切り捨てた値から、最大値をceiling_date()で切り上げた値までの、1年間隔の値を作成します。

 各メンバーの加入時と卒業時の情報を作成します。

# 加入時・卒業時ラベルを作成
label_df <- chart_df |> 
  dplyr::group_by(member_id) |> # データ抽出用にグループ化
  dplyr::filter(date == min(date) | date == max(date)) |> # 加入時・卒業時のデータを抽出
  dplyr::mutate(
    label = dplyr::case_when(
      date == min(date) ~ paste0(memberName, " (", age, "歳) "), 
      date == max(date) ~ paste0(" (", age, "歳:", act_y, "年", act_m, "か月", act_d, "日)")
    ), # 年齢・活動年数ラベルを作成
    h = dplyr::case_when(
      date == min(date) ~ 1, 
      date == max(date) ~ 0
    )
  ) |> # プロット位置の調整用の値を追加
  dplyr::ungroup() # グループ化を解除
label_df |> 
  dplyr::select(member_id, memberName, id_label, diff, label, h) # 確認用
## # A tibble: 113 × 6
##    member_id memberName     id_label             diff label                    h
##        <int> <chr>          <fct>               <dbl> <chr>                <dbl>
##  1         1 有原栞菜       member 1:group 18    0   "有原栞菜 (11歳) "       1
##  2         2 諸塚香奈実     member 2:group 18    0   "諸塚香奈実 (14歳) "     1
##  3         3 橋本愛奈       member 3:group 18    0   "橋本愛奈 (11歳) "       1
##  4         4 秋山ゆりか     member 4:group 18    0   "秋山ゆりか (11歳) "     1
##  5         5 大瀬楓         member 5:group 18    0   "大瀬楓 (13歳) "         1
##  6         6 岡田ロビン翔子 member 6:group 18    0   "岡田ロビン翔子 (11…     1
##  7         7 後藤夕貴       member 7:group 18    0   "後藤夕貴 (11歳) "       1
##  8         8 是永美記       member 8:group 18    0   "是永美記 (18歳) "       1
##  9         9 能登有沙       member 9:group 18    0   "能登有沙 (15歳) "       1
## 10        10 和田彩花       member 10:group 18  -0.5 "和田彩花 (10歳) "       1
## # … with 103 more rows

 加入時(date列の小さい方)の場合は年齢、卒業時(date列の大きい方)の場合は年齢と活動年数の文字列を作成します。
 また、プロット位置の調整用の値(hjust引数に指定する値)を追加します。加入時ラベルの場合は1、卒業時ラベルの場合は0にします。

 タイムラインチャートを作成します。

# ラインチャートを作成:デフォルト配色
ggplot() + 
  geom_line(data = chart_df, mapping = aes(x = date, y = member_id+diff*0.2, color = groupName, group = id_label), 
            alpha = 0.8, size = 2) + # 活動期間ライン
  geom_text(data = label_df, mapping = aes(x = date, y = member_id, hjust = h, label = label, color = groupName), 
            show.legend = FALSE) + # 加入時・卒業時ラベル
  scale_x_date(breaks = date_vec, date_labels = "%Y-%m", guide = guide_axis(angle = 45), expand = c(0, 0)) + # x軸目盛
  scale_y_reverse() + # y軸を反転
  coord_cartesian(clip = "off") + # 表示範囲
  theme(
    #axis.title.y = element_blank(), # 縦軸のラベル
    #axis.text.y = element_blank(), # 縦軸の目盛ラベル
    #axis.ticks.y = 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 = 120, b = 10, l = 100, unit = "pt"), # 全体の余白
    legend.position = "top" # 凡例の表示位置
  ) + # 図の体裁
  labs(
    title = paste0("歴代ハロプロキッズ・エッグ・研修生の活動期間"), 
    subtitle = paste0(
      format(date_from, format = "%Y年%m月%d日"), "~", format(date_to, format = "%Y年%m月%d日"), 
      "の在籍メンバー:", length(unique(chart_df[["member_id"]])), "人"
    ), 
    x = "年-月", y = "メンバー", 
    color = "グループ", 
    caption = "データ:「https://github.com/xxgentaroxx/HP_DB」"
  ) # ラベル

デフォルト配色のチャート

 y軸をメンバーID(member_id列)にすることで、各メンバーの線を縦に並べて描画します。ただし、重複期間が分かりやすいようにdiff(に係数を掛けた値)を加えておきます。
 加入日ごとに昇順に並べるために、scale_y_reverse()でy軸を反転させます。
 加入時と卒業時のラベルをgeom_text()で描画します。

 各グループの配色を指定する場合は、color列に指定する値(この例ではグループ名の文字列)と対応する色情報を作成します。

# グループ名と配色の対応表を作成
color_df <- tibble::tibble(
  groupName = c(
    "ハロー!プロジェクト・キッズ", "ハロプロエッグ", "ハロプロ研修生", "ハロプロ研修生北海道", 
    "モーニング娘。", "モーニング娘。 '22", 
    "Berryz工房", "℃-ute", "THEポッシボー", "ハロプロ関西", "SI☆NA", 
    "スマイレージ", "アンジュルム", "Juice=Juice", 
    "カントリー・ガールズ", "こぶしファクトリー", "つばきファクトリー", 
    "BEYOOOOONDS", "OCHA NORMA"
  ), 
  color_code = c(
    "turquoise", "mediumaquamarine", "#33D6AD", "#1CBDBA", 
    "hotpink", "hotpink", 
    "yellow", "red", "pink", "orange", "orange", 
    "blue", "blue", "green", 
    "limegreen", "turquoise1", "greenyellow", 
    "lightblue1", "skyblue1"
  )
)
color_df
## # A tibble: 19 × 2
##    groupName                   color_code      
##    <chr>                       <chr>           
##  1 ハロー!プロジェクト・キッズ turquoise       
##  2 ハロプロエッグ              mediumaquamarine
##  3 ハロプロ研修生              #33D6AD         
##  4 ハロプロ研修生北海道        #1CBDBA         
##  5 モーニング娘。              hotpink         
##  6 モーニング娘。 '22          hotpink         
##  7 Berryz工房                  yellow          
##  8 ℃-ute                       red             
##  9 THEポッシボー               pink            
## 10 ハロプロ関西                orange          
## 11 SI☆NA                       orange          
## 12 スマイレージ                blue            
## 13 アンジュルム                blue            
## 14 Juice=Juice                 green           
## 15 カントリー・ガールズ        limegreen       
## 16 こぶしファクトリー          turquoise1      
## 17 つばきファクトリー          greenyellow     
## 18 BEYOOOOONDS                 lightblue1      
## 19 OCHA NORMA                  skyblue1

 グループ名(groupName列の文字列)と色名またはカラーコードを指定します。(いつか自動化したい。)

 タイムラインチャートを作成します。

# ラインチャートを作成:配色を指定
ggplot() + 
  geom_line(data = chart_df, mapping = aes(x = date, y = member_id+diff*0.2, color = as.character(groupName), group = id_label), 
            alpha = 0.8, size = 2) + # 活動期間ライン
  geom_text(data = label_df, mapping = aes(x = date, y = member_id, hjust = h, label = label, color = as.character(groupName)), 
            show.legend = FALSE) + # 加入時・卒業時ラベル
  scale_x_date(breaks = date_vec, date_labels = "%Y-%m", guide = guide_axis(angle = 45), expand = c(0, 0)) + # x軸目盛
  scale_y_reverse() + # y軸を反転
  scale_color_manual(breaks = color_df[["groupName"]], values = color_df[["color_code"]]) + # 線の色
  coord_cartesian(clip = "off") + # 表示範囲
  theme(
    #axis.title.y = element_blank(), # 縦軸のラベル
    #axis.text.y = element_blank(), # 縦軸の目盛ラベル
    #axis.ticks.y = 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 = 120, b = 10, l = 100, unit = "pt"), # 全体の余白
    legend.position = "top" # 凡例の表示位置
  ) + # 図の体裁
  labs(
    title = paste0("歴代ハロプロキッズ・エッグ・研修生の活動期間"), 
    subtitle = paste0(
      format(date_from, format = "%Y年%m月%d日"), "~", format(date_to, format = "%Y年%m月%d日"), 
      "の在籍メンバー:", length(unique(chart_df[["member_id"]])), "人"
    ), 
    x = "年-月", y = "メンバー", 
    color = "グループ", 
    caption = "データ:「https://github.com/xxgentaroxx/HP_DB」"
  ) # ラベル

ハロプロエッグメンバーの活動期間チャート

 scale_color_manual()で配色を設定します。breaks引数にaes()color引数に指定した文字列、values引数に色を指定します。

・他の期間のチャート

ハロプロキッズメンバーの活動期間チャート

ハロプロ研修生メンバーの活動期間チャート

ハロプロ研修生メンバーの活動期間チャート

 つづく。

おわりに

 このところ色々やっていて進まないので、想定の3分の1の完成度なんですがとりあえず記事をアップします。ディテールアップ版とアニメーション版を追加予定です。