ggplot2で時系列データのプロット。凡例の順番とx軸の表示方法【好きなお笑い芸人のトレンドを追う】

ggplotで実数データを1軸、或いは2軸でプロットすることは非常にわかりやすく、体裁も修正しやすいです。チートシートも充実しています。
x軸が時系列データになると少しややこしいな～と思ったので、ここで簡単につまずきやすいポイントをまとめてみました。

##使用データ
Googleトレンドを使用してデータを作ります。
今回は私の愛してやまないお笑い芸人オードリーのトレンドデータを作成します。
####ドメイン知識
オードリー（お笑いコンビ）とは
>オードリーは、ケイダッシュステージに所属する若林正恭と春日俊彰からなる日本のお笑いコンビ。2000年4月にコンビ結成。M-1グランプリ2008準優勝。
.....
>2008年12月21日、『M-1グランプリ』で敗者復活戦から決勝進出を果たし、決勝ファーストラウンドを1位通過し、総合2位。2009年1月1日、フジテレビ『新春お笑い大賞2009!!』でニューウェーブ大賞1位を受賞（視聴者による電話投票で212,036票中76,009票獲得）。
>
>2009年11月12日、春日の代表的なギャグの1つ、「トゥース!」が新語・流行語大賞にノミネートされ、流行語大賞候補になる[8][9]。

参照: [Wikipedia オードリー（お笑いコンビ）]
(https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC_(%E3%81%8A%E7%AC%91%E3%81%84%E3%82%B3%E3%83%B3%E3%83%93))

2008~2009年に大ブレイクして現在も活躍中です。今回はM1グランプリ準優勝翌月の2009年1月からの時系列トレンドデータを作成します。

##データ抽出と前処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031677/905cfe6d-b63a-fd44-bb1b-25d84c7ecd31.png)
Googleトレンドで、「オードリー」「オードリー春日」「オードリー若林」の各キーワードで抽出します。
今回の目的は画像のようなグラフをggplot2で作成することですね。
このデータをcsvファイルで出力し、時間データをTime, 各キーワードを"Audrey", "Kasu", "Waka"としてデータセットを作成します。（ここまではcsvファイル上の操作）

Rにインポートしてどんな感じか見てみましょう

```.R
library(tidyverse)
library(ggplot2)
df <- read_csv("TLToose.csv") #Googleトレンドより抽出
head(df) #最初数か月
# A tibble: 6 x 4
  Time       Audrey  Kasu  Waka
  <date>      <dbl> <dbl> <dbl>
1 2009-01-01     18    28    11
2 2009-02-01     10    39    13
3 2009-03-01     14    32    18
4 2009-04-01      7    16    16
5 2009-05-01     11    21    11
6 2009-06-01      6    16    18

tail(df) #最近数か月
# A tibble: 6 x 4
  Time       Audrey  Kasu  Waka
  <date>      <dbl> <dbl> <dbl>
1 2021-04-01     38     4     3
2 2021-05-01     39     4     5
3 2021-06-01     38     4     5
4 2021-07-01     33     5     4
5 2021-08-01     34     4     5
6 2021-09-01     33     4     7

summary(df)
      Time                Audrey           Kasu             Waka       
 Min.   :2009-01-01   Min.   :  0.0   Min.   : 2.000   Min.   : 2.000  
 1st Qu.:2012-03-01   1st Qu.:  2.0   1st Qu.: 4.000   1st Qu.: 4.000  
 Median :2015-05-01   Median :  3.0   Median : 5.000   Median : 5.000  
 Mean   :2015-05-02   Mean   : 18.2   Mean   : 8.046   Mean   : 6.137  
 3rd Qu.:2018-07-01   3rd Qu.: 34.0   3rd Qu.: 8.000   3rd Qu.: 7.000  
 Max.   :2021-09-01   Max.   :100.0   Max.   :49.000   Max.   :50.000  
```
コンビ格差が思ったよりないなぁとか、このデータだけでもいいことはたくさんあるのですが、さっそく可視化に移ります。データセットに問題はなさそうなのでそのまま使用しましょう。
##可視化

```.R
g <- ggplot(data=df) + 
  geom_line(aes(Time,Audrey)) + #「オードリー」のトレンド
  geom_line(aes(Time, Kasu),col="pink") + #「オードリー春日」のトレンド
  geom_line(aes(Time,Waka),col="green") + #「オードリー若林」のトレンド
  labs(y="count") #y軸のラベルを変更
plot(g)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031677/2a71b395-c92e-2767-2f38-963bdd167cc1.png)
それっぽくなりました。簡単じゃん。
と思ったのですが、よく見ると
・x軸のメモリ間隔が広すぎないか？
・月ごとのデータだからどこがどの時点なのか知りたい
・せっかく色で分けたのだから凡例をつけたい
・若林+春日って「オードリー」って検索数と比べてどんくらいになるんだろう（個人的興味）
こんな欲が出てきましたので、以下のコードで修正します。

####縦持ちデータにして凡例を表示させる

```.R
#春日若林の合計値を作成
df <- df %>% mutate(kw=Kasu+Waka)
#縦持ちデータに変換
df.long <- df %>% pivot_longer(cols=!Time,names_to = "keyword",values_to = "search_count")
head(df.long,12)
# A tibble: 12 x 3
   Time       keyword search_count
   <date>     <chr>          <dbl>
 1 2009-01-01 Audrey            18
 2 2009-01-01 Kasu              28
 3 2009-01-01 Waka              11
 4 2009-01-01 kw                39
 5 2009-02-01 Audrey            10
 6 2009-02-01 Kasu              39
 7 2009-02-01 Waka              13
 8 2009-02-01 kw                52
 9 2009-03-01 Audrey            14
10 2009-03-01 Kasu              32
11 2009-03-01 Waka              18
12 2009-03-01 kw                50
p <- df.long %>% ggplot(aes(x=Time,y=search_count,colour=keyword)) + 
  geom_line() + 
  scale_x_date(breaks="1 month") #x軸を1月区切りで表示する

plot(p)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031677/dc678ef3-91ec-db46-64f3-4e40bd2ea6c9.png)

凡例が出てきた！そしてx軸のスケールも修正された！
けど・・・
・凡例の色が気に食わない（春日はピンクにしたい）
・x軸が重なりすぎて読めない
これらを修正

####凡例の順番と色を操る

凡例と色を一致させるために、凡例の順番を確認します。
凡例はfactornの水準の小さい順に表示されるのでkeword列の水準を確認します

```.R
as.factor(df.long$keyword) %>% head
[1] Audrey Kasu   Waka   kw     Audrey Kasu  
Levels: Audrey Kasu kw Waka
```

この順番をAudrey, Kasu, Waka, kwに変更

```.R
df.long$keyword <- factor(df.long$keyword, levels = c("Audrey","Kasu","Waka","kw")) #水準変更
as.factor(df.long$keyword) %>% head
[1] Audrey Kasu   Waka   kw     Audrey Kasu  
Levels: Audrey Kasu Waka kw
```

これで凡例の表示順を修正できました。
プロットしましょう

####x軸ラベルを見えるようにする

```.R
p <- p + 
  theme(axis.text.x = element_text(angle = 70, hjust = 1, size=8)) + #x軸の文字の角度と高さを調整。フォントサイズも小さくする
  scale_color_manual(values = c('black','pink','green','blue')) #水準の順番で色付け

plot(p)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031677/5a69ba61-eadd-dff0-bdff-a1682a783c07.png)

文字がめっちゃ小さくなったけど目的は達成しました。
オードリーはブレイクから10年以上たっても人気の衰えない芸人ですね。トゥース！