0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-11-18

image.png

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

「R言語」で英国(United Kingdom)のオープンデータを取得します。
使うデータは新型コロナウイルスの3回目のワクチン接種数(People who have received booster or 3rd dose vaccinations)のcsv
日毎の数字と、その累計の数字を使った2本のグラフを重ね描きします。

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

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」の関数です。

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

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」値(欠損値)が入っているのを見つけました。

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」を含むレコードを削除します。

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」で足掻こうしとしましたが、エラーが出ました。

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

データフレーム 型に変換

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

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

x軸をYY月dd日に

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

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

image.png

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

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

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

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

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

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

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

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

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

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

image.png

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

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

image.png

第2y軸用グラフ描画

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

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

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

image.png

第2y軸目盛りを追加

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

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

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

image.png

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


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

image.png

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

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?