「R で CSV のデータをグラフにするまで」 https://qiita.com/Nabetani/items/91a2ffd7a3778a60c85b の続き。
CSVを読んでそのままグラフにするんじゃなくて、加工してからグラフにしたいよね。
用意した 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 を使う
そうすると、こんなスクリプトを書くことになると思う:
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
という関数が便利だった。一発で 累積和を出すことができる。
出来上がるグラフはこんな
感じ。
「Σ」を出すためにフォントを指定するところが難しかった。
pch
の番号と図形の対応( http://www.sthda.com/english/wiki/r-plot-pch-symbols-the-different-point-shapes-available-in-r )がわけわからん。Rのエキスパートはよく使うのを覚えてるんだろうなぁ。
ggplot2 を使う
ggplot2 を使ってもうちょっと美しいグラフにしてみる。
スクリプトはこんな感じ:
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
という関数を見つけるのにだいぶ手間取った。
出来上がりは
こう。背景にいい感じに軸があって好ましい。
ggplot2 + quartz
しかし。フォントが等幅なのが気に入らない。
幸い私が使っている端末は macOS なので、quartz
関数が使える。
quartz
を使うと、OS に入っているフォントを自由に使えるらしい。
こんな感じ。
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()
出力はこんな感じ:
ちゃんとプロポーショナルフォントになっている。
フォント名は、Font Book というアプリで「PostScript名」を確認すればわかる。