LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-31

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

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

用意した CSV は

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 を使う

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

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 という関数が便利だった。一発で 累積和を出すことができる。

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

image.png

感じ。

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

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

ggplot2 を使う

ggplot2 を使ってもうちょっと美しいグラフにしてみる。

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

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

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

ggplot2 + quartz

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

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

こんな感じ。

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

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

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

0
0
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
0