R で CSV のデータを加工してグラフにするまで

「R で CSV のデータをグラフにするまで」 https://qiita.com/Nabetani/items/91a2ffd7a3778a60c85b の続き。

CSVを読んでそのままグラフにするんじゃなくて、加工してからグラフにしたいよね。

用意した CSV は

```text:hoge.csv
time,hoge,fuga
0.94836647172205,0.853344367680207,0.688772235841213
1.37429959419257,1.15153115196311,0.197615609674306
1.90931583748788,0.996126006909045,-0.202808878337388
1.95751827612672,0.997688995827512,-0.162760517081181
2.51880662644533,0.710145106373831,-0.803739559203379
2.59256148091266,0.614856754960225,-0.819677620574445
3.44619342082835,-0.116687690183687,-0.731202765129945
3.89369647245932,-0.570190341918949,-0.725215517101109
3.96927454610032,-0.535012918493774,-0.657986069401044
```

こんな感じ。
時刻ごとに hoge と fuga を観測しているという想定。まあこのデータは味付けした乱数だけど。

で。

hoge と fuga の時間積分のような値が欲しいとする。

# 標準の plot を使う

そうすると、こんなスクリプトを書くことになると思う：

```r:hoge.r
pdf("hoge.pdf",
    family="Japan1GothicBBB", # 「Σ」を出すために必要
    width=8, height=5) # 8×5 inch
d<-read.csv("hoge.csv")
len <- length(d[,"time"])
d$dt<-c(d$time[2:len] - d$time[1:(len-1)], NA) # time の差分を dt とする
d$"Σhoge×dt"<-c(0,cumsum(d$hoge * d$dt)[1:(len-1)]) # cumsum 便利。
d$"Σfuga×dt"<-c(0,cumsum(d$fuga * d$dt)[1:(len-1)]) # cumsum 便利。
y = c(d$"Σhoge×dt", d$"Σfuga×dt")
ymax <- max( y )
ymin <- min( y )
ylim=c(ymin,ymax)

plot( x=d$time, y=d$"Σhoge×dt", 
      ylim=ylim, pch=20, type="o", xlab="time", ylab="foo", col=2)
lines(x=d$time, y=d$"Σfuga×dt", pch=21, type="o", col=3)

legend("bottomleft", 
        legend=c("Σhoge×dt", "Σfuga×dt"),
        pch=c(20,21),col=2:3,lty=1)

dev.off()
```

[`cumsum`]( https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/cumsum ) という関数が便利だった。一発で 累積和を出すことができる。

出来上がるグラフはこんな

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6854/7e609c0a-8775-e45e-ce32-8cea6be71a74.png)

感じ。

「Σ」を出すためにフォントを指定するところが難しかった。

`pch` の番号と図形の対応( http://www.sthda.com/english/wiki/r-plot-pch-symbols-the-different-point-shapes-available-in-r )がわけわからん。Rのエキスパートはよく使うのを覚えてるんだろうなぁ。

# ggplot2 を使う

[ggplot2]( https://ggplot2.tidyverse.org/index.html ) を使ってもうちょっと美しいグラフにしてみる。

スクリプトはこんな感じ：

```r:gghoge.r
library( ggplot2 )

pdf("gghoge.pdf",
    family="Japan1GothicBBB", # 日本語などを出すなら必要
    width=8, height=5) # 8×5 inch
d<-read.csv("hoge.csv")
len <- length(d[,"time"])
d$dt<-c(d$time[2:len] - d$time[1:(len-1)], NA) # time の差分を dt とする
d$"Σhoge×dt"<-c(0,cumsum(d$hoge * d$dt)[1:(len-1)])
d$"Σfuga×dt"<-c(0,cumsum(d$fuga * d$dt)[1:(len-1)])
y = c(d$"Σhoge×dt", d$"Σfuga×dt")
gg<-ggplot(data=d)
hoge<-aes(x=d$time, y=d$"Σhoge×dt", color="Σhoge×dt")
fuga<-aes(x=d$time, y=d$"Σfuga×dt", color="Σfuga×dt")
hoge_l<-geom_line(mapping=hoge)
hoge_p<-geom_point(mapping=hoge)
fuga_l<-geom_line(mapping=fuga)
fuga_p<-geom_point(mapping=fuga)
labels<-labs( x="time", y="foo", color="Lorem Ipsum" )
gg+hoge_l+hoge_p+fuga_l+fuga_p+labels # 代入のない足し算でグラフ描画

invisible(dev.off())

warnings()
```

足し算でグラフを出力という意外な展開に驚いた。
あとは、`labs` という関数を見つけるのにだいぶ手間取った。

出来上がりは

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6854/0e4e87db-60a2-a520-5003-37ad1a170e47.png)

こう。背景にいい感じに軸があって好ましい。

# ggplot2 + quartz

しかし。フォントが等幅なのが気に入らない。
幸い私が使っている端末は macOS なので、`quartz` 関数が使える。

 `quartz` を使うと、OS に入っているフォントを自由に使えるらしい。

こんな感じ。

```R:gghoge2.r
library( ggplot2 )
quartz(type="pdf", # pdf ではなく、quartz  にすると、OS のフォントを自由に使える
  file="gghoge.pdf", 
  width=8, height=5)
d<-read.csv("hoge.csv")
len <- length(d[,"time"])
d$dt<-c(d$time[2:len] - d$time[1:(len-1)], NA) # time の差分を dt とする
d$"Σhoge×dt"<-c(0,cumsum(d$hoge * d$dt)[1:(len-1)])
d$"Σfuga×dt"<-c(0,cumsum(d$fuga * d$dt)[1:(len-1)])
y = c(d$"Σhoge×dt", d$"Σfuga×dt")
gg<-ggplot(data=d)
hoge<-aes(x=d$time, y=d$"Σhoge×dt", color="Σhoge×dt")
fuga<-aes(x=d$time, y=d$"Σfuga×dt", color="Σfuga×dt")
hoge_l<-geom_line(mapping=hoge)
hoge_p<-geom_point(mapping=hoge)
fuga_l<-geom_line(mapping=fuga)
fuga_p<-geom_point(mapping=fuga)
labels<-labs( x="time", y="foo", color="Lorem Ipsum" )
th<-theme( text=element_text( family="HiraginoSans-W6") ) # フォント名の指定
gg+th+hoge_l+hoge_p+fuga_l+fuga_p+labels # 代入のない足し算でグラフ描画

invisible(dev.off())

warnings()
```

出力はこんな感じ：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6854/ea7aa211-01c1-371c-e5d2-5cc0ec74d62c.png)

ちゃんとプロポーショナルフォントになっている。

フォント名は、Font Book というアプリで「PostScript名」を確認すればわかる。