「R」で時系列データの扱い練習。「plot 」で重ね書きするように2軸グラフ作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/f72ffb7e-15f5-d7cc-e1e6-f25b831b2bcc.png)

##「read.csv」でなく「read_csv」で取得

「R言語」で英国（United Kingdom）のオープンデータを取得します。
使うデータは新型コロナウイルスの3回目のワクチン接種数（People who have received booster or 3rd dose vaccinations）の[csv](https://coronavirus.data.gov.uk/api/v1/data?filters=areaType=overview&structure=%7B%22areaType%22:%22areaType%22,%22areaName%22:%22areaName%22,%22areaCode%22:%22areaCode%22,%22date%22:%22date%22,%22newPeopleVaccinatedThirdInjectionByPublishDate%22:%22newPeopleVaccinatedThirdInjectionByPublishDate%22,%22cumPeopleVaccinatedThirdInjectionByPublishDate%22:%22cumPeopleVaccinatedThirdInjectionByPublishDate%22%7D&format=csv)。
日毎の数字と、その累計の数字を使った2本のグラフを重ね描きします。

https://coronavirus.data.gov.uk/details/vaccinations?areaType=overview&areaName=United%20Kingdom

まず、標準Rの「read.csv」を使用しましたが、以下のようなエラー。
パラメータを変え何パターンか試すなどしましたが、うまくいきませんでした。

```R
ukv3 <- read.csv("https://coronavirus.data.gov.uk/api/v1/data?xxxxx.csv", header = T)
 read.table(file = file, header = header, sep = sep, quote = quote,  でエラー: 
   列名よりも列数のほうが多いです 
```

「read_csv」に切り替えたらすぐに取得できました。

##「readr」パッケージを使用

「read_csv」は、ファイルの読み込み・書き込み用パッケージ「readr」の関数です。

https://oku.edu.mie-u.ac.jp/~okumura/stat/readr.html

以下の設定で読み込みできました。

```R
library(readr)
ukv3 <- read_csv("https://coronavirus.data.gov.uk/api/v1/data?xxxxx.csv")

head(ukv3)
# A tibble: 6 x 6
  areaType areaName   areaCode date       newPeopleVaccinatedThi… cumPeopleVaccinatedThi…
  <chr>    <chr>      <chr>    <date>                       <dbl>                   <dbl>
1 overview United Ki… K020000… 2021-11-16                  347557                13494890
2 overview United Ki… K020000… 2021-11-15                  286582                13147333
3 overview United Ki… K020000… 2021-11-14                  217349                12860751
4 overview United Ki… K020000… 2021-11-13                  461985                12643402
5 overview United Ki… K020000… 2021-11-12                  357774                12181417
6 overview United Ki… K020000… 2021-11-11                  370989                11823643

```

##データを確認

読み込んだデータを確認します。
「NA」値（欠損値）が入っているのを見つけました。

```R
str(ukv3) #データの型を確認
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':	48 obs. of  6 variables:
 $ areaType                                      : chr  "overview" "overview" "overview" "overview" ...
 $ areaName                                      : chr  "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
 $ areaCode                                      : chr  "K02000001" "K02000001" "K02000001" "K02000001" ...
 $ date                                          : Date, format: "2021-11-16" "2021-11-15" ...
 $ newPeopleVaccinatedThirdInjectionByPublishDate: num  347557 286582 217349 461985 357774 ...
 $ cumPeopleVaccinatedThirdInjectionByPublishDate: num  13494890 13147333 12860751 12643402 12181417 ...


tail(ukv3)
# A tibble: 6 x 6
  areaType areaName   areaCode date       newPeopleVaccinatedThi… cumPeopleVaccinatedThi…
  <chr>    <chr>      <chr>    <date>                       <dbl>                   <dbl>
1 overview United Ki… K020000… 2021-10-05                  156100                 1586070
2 overview United Ki… K020000… 2021-10-04                  123877                 1429970
3 overview United Ki… K020000… 2021-10-03                   89518                 1306093
4 overview United Ki… K020000… 2021-10-02                  194461                 1216575
5 overview United Ki… K020000… 2021-10-01                  153912                 1022114
6 overview United Ki… K020000… 2021-09-30                      NA                  868202

```

##「NA」を削除

不具合が生じるかもしれないので、「NA」を含むレコードを削除します。

```R
library(tidyr)
ukv3a <- ukv3 %>% drop_na() #欠損値を含むデータを削除

tail(ukv3a)
# A tibble: 6 x 6
  areaType areaName   areaCode date       newPeopleVaccinatedThi… cumPeopleVaccinatedThi…
  <chr>    <chr>      <chr>    <date>                       <dbl>                   <dbl>
1 overview United Ki… K020000… 2021-10-06                  162097                 1748167
2 overview United Ki… K020000… 2021-10-05                  156100                 1586070
3 overview United Ki… K020000… 2021-10-04                  123877                 1429970
4 overview United Ki… K020000… 2021-10-03                   89518                 1306093
5 overview United Ki… K020000… 2021-10-02                  194461                 1216575
6 overview United Ki… K020000… 2021-10-01                  153912                 1022114
```

日付と、日毎の計測値の散布図を「plot」で足掻こうしとしましたが、エラーが出ました。

```R
par(xaxt="n")
plot(ukv3a[,4], ukv3a[,5])
 xy.coords(x, y, xlabel, ylabel, log) でエラー: 
  'x' and 'y' lengths differ
```

##データフレーム 型に変換

「class」でデータ型を確認。
少しデータフレームと異なる形式のようです。
（tbl_dfは、データフレームのサブクラスで、振る舞いが異なるそうです）
データフレーム 型に変換して、plotを実行しました。

```R
class(ukv3a)
[1] "tbl_df"     "tbl"        "data.frame"

ukv3b <- as.data.frame(ukv3a)
class(ukv3b)
[1] "data.frame"

plot(ukv3b[,4], ukv3b[,5])

#as.data.frameで変換しないでplotを実行すると以下のエラー
#xy.coords(x, y, xlabel, ylabel, log) でエラー: 
#  'x' and 'y' lengths differ
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/90c3c07f-00f1-ffae-4cf7-47e4c9b6534e.png)

##x軸をYY月dd日に

plotでは、日付を寺家列データとして扱ってくれますが、上記のように日付らしい目盛り表記ではないので、「YY月dd日」」というスタイルに変えます。
まず、「par(xaxt="n")」を指定し、ｘ軸目盛りを外した状態でグラフを描き直します。
ｘ軸は後で描き足します。

```R
dev.new() #新規描画ウインドウ
par(family="HiraKakuPro-W3")
par(xaxt="n")
plot(ukv3b[,4], ukv3b[,5])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/9ece463a-0b08-c109-7686-5a4067e9b39e.png)


「par(xaxt="s")」でx軸を追加できる状態にします。
「axis.Date」で日付型の目盛表記の体裁を決め、追記します。

```R
par(xaxt="s")
axis.Date(
    1,   
    at=seq(
        min(ukv3b[,4]),
        max(ukv3b[,4]),
        "week"
          ),
  format="%m月%d日"
)

#描画位置：1　=　下 2　=　左 3　=　上 4　=　右
#at = seqでは最小値,最大値,目盛間隔
#formatで表示形式
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/4a1508d3-e06d-e966-2cc0-a8ba42627bf2.png)


##x、y軸に指定ラベル付与

x軸とy軸のラベル（タイトル）を変更しておきます。
もう一度設を設定を変え、グラフを書き直します。
ラベルは「xlab」「ylab」で指定します。

```R
dev.new()
par(family="HiraKakuPro-W3")
par(xaxt="n")

plot(
  ukv3b[,4], 
  ukv3b[,5], 
  xlab="time", 
  ylab="value"
  )

par(xaxt="s")
axis.Date(
    1,   
    at=seq(
        min(ukv3b[,4]),
        max(ukv3b[,4]),
        "week"
          ),
  format="%m月%d日"
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/467d064b-30f1-60b6-76eb-37f742f57bff.png)


##右側に第2y軸追加の準備

取得したデータには、「累計」の数値も収録されていました。
累計グラフを追加し、右側にそのy軸を追加します。
再度グラフを描き直します。
ただ、デフォルトでは、右側にメモリを追加するスペースがないので、「par(mar=***)」を使い、右側にも左側と同じスペースを空けます。

```R
dev.new()
par(mar = c(5, 5, 3, 5)) #下、左、上、右の順
par(family="HiraKakuPro-W3")
par(xaxt="n")
plot(
  ukv3b[,4], ukv3b[,5], 
  xlab="time", ylab="value", 
  type="b", 
  las = 2, 
  cex.axis = 0.6,
  col = "blue",
  lwd = 2
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/6d5ebd9c-b8bf-db15-92d8-fd32037ce015.png)

先ほどと同様に日付型目盛りをx軸に追加します。

```R
par(xaxt="s", cex.axis=0.6)
axis.Date(
    1,
    at=seq(min(ukv3b[,4]),max(ukv3b[,4]),
    "week"),
  format="%m月%d日"
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/f2abefd6-fe0d-c4c6-181f-d6d5dbb96a7b.png)

「text」で各プロットのデータラベル（数値）も記載しておきます。

```R
text(
  ukv3b[,4], ukv3b[,5],  
  as.character(ukv3b[,5]), 
  cex=0.6, 
  pos=3, 
  col="red"
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/91d76588-7376-682c-e91a-2d7b5c528a1b.png)

##第2y軸用グラフ描画

「par(new = T)」を実行し、plotで累計推移グラフを加えます。

```R
par(new = T) #現在のplotに上描きの設定

plot( 
  ukv3b[,4], ukv3b[,6], 
  type = "l", 
  axes = FALSE, #目盛りを記載しない
  xlab = "",
  ylab = "", #軸タイトルも記載しない
  col="grey", 
  lwd = 2
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/d723a240-1c30-a879-e4e0-b6830281c990.png)

##第2y軸目盛りを追加

「axis」を使い、第2y軸目盛りを描き足します。  

```R
axis(
  4, 
  las = 2, 
  col="grey", 
  col.axis="grey"
) 

#目盛り追記：1は下,2は左,3は上,4は右
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/a55127a3-f5b9-490b-3b44-a7f2dce2eb3c.png)

```R
#2軸目のラベル設定
mtext("cumPeopleVaccinatedThirdInjectionByPublishDate", #2軸目のラベル名
      side = 4, 
      line = 4, 
      cex.axis = 0.6,
      col="grey"
      )


#​​side でラベル位置：。1は下,2は左,3は上,4は右
#l​ineでグラフのからの距離指定
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/f72ffb7e-15f5-d7cc-e1e6-f25b831b2bcc.png)

何度も描き直しましたが、目的のグラフが作成できました。
y軸の目盛り数値を「e」（10のべき乗）を使わない型にしようと思ったり、グラフのプロットのラベルをコンマ入りの数字にしようと思ったりしたのですが、後で調べることにしました。

**了**