読者です 読者をやめる 読者になる 読者になる

ggplotできれいなグラフを描こう

グラフを描くときにどうするか? 何らかのデータを扱う者にとっては共通の悩みだろう. 自分の場合,面倒なときはデータをexcelに落としこんでから簡単にグラフを描いてしまうことが多い.

しかし,次のような場合はどうだろう? Rがサーバーで稼働していて,データもサーバーに保存される.それをいちいちscpやrsyncでローカルに転送してexcelで描写....これが一回ポッキリならまだいいだろう.でも,頻繁に変更が発生するデータだったら?bashスクリプトでも書いて,自動でローカルに転送する?

もし,サーバーでRstudioが稼働しているなら,もっと簡単な方法がある.

Rにはggplotというグラフ描写用のライブラリがある. このライブラリでグラフを描写してしまえばいいのだ.それなら,いちいちローカルに転送せなんでも,グラフを確認できる.

ただし,このggplotは記法だけでなく,考え方も特殊で,ggplot用の考え方でデータフレームを考えないと,わけがわからなくなる.

そこで,自分用のメモを残しておく.

参考にしたリンクとか

http://smrmkt.hatenablog.jp/entry/2013/03/16/170914
http://d.hatena.ne.jp/triadsou/20100528/1275042816


データの準備

library(ggplot2)
library(hexbin)
library(quantreg)
library(reshape2)

d_diamonds <- diamonds
d_subset <- d_diamonds[,c("cut","x","y","z")]
d_melt <- melt(d_subset, id="cut")

data(iris)

一つの図内に複数のデータをしめしたいとき

要は,複数の種類の折れ線グラフ書きたいときとか.

この時,melt関数を使って,データフレームの変形をしないといけない. id=で変形後のキーにしたい列名をしていする.

iris.m <- melt(iris, id="Species")

さて,これでグラフを描く準備ができた.

記法はggplot(data=データフレーム名, aes(x=xになる列, y=yになる列, group=符号化して,グループ分けしたい列))でグラフオブジェクトの準備をする.ここで注意は,x=,y=で列名を指定するときに,タブルクオートは必要ないこと

ま,変なグラフになるけど,練習だからご愛嬌ってことで.

#折れ線グラフで表示してみる
#当然,折れ線グラフ向きのデータでないので変になる
p <- ggplot(data=iris.m, aes(x=variable, y=value, group=Species))
p + geom_line(aes(colour=Species))

#実は,.変動幅がある変数なので,箱ひげ図を使うのが正解
ggplot(iris.m, aes(x = variable, y = value)) + geom_boxplot(aes(fill = Species))

f:id:kensuke-mi:20140507080718p:plain

melt関数を使わずに1つの図内に複数のデータを描いてみる

#複数元からのデータを使ってmelt()関数を使わなくてもいい方法
p1 <- ggplot(data=d_diamonds, aes(x=x))
#まずは単一のデータからヒストグラムを描いてみる
p1 + geom_histogram(binwidth=0.1, alpha=0.5)
#次に,別のデータからヒストグラムを重ねあわせる
#記法:+ geom_histogram(aes(x=別のデータ列名))
p1 + geom_histogram(binwidth=0.1, alpha=0.5) + geom_histogram(aes(x=y), binwidth=0.1, alpha=0.5) + xlim(0,10)

f:id:kensuke-mi:20140507080652p:plain

別々のデータフレームからもってきた複数のデータを1つの図内にしめしたい時

#それぞれ別のデータフレームからデータを引っ張ってきて,1つのグラフに重ねあわせ描写する
#まったく意味はないが,車のデータとirisのデータで重ね合わせをしてみる
d_cars <- mtcars
p2 <- ggplot(data=d_cars, aes(x=gear))
p2 + geom_histogram(binwidth=0.1,alpha=0.5)
p2 + geom_histogram(binwidth=0.1,alpha=0.5) + geom_histogram(data=iris, aes(x=Sepal.Width), binwidth=0.1,alpha=0.5)

f:id:kensuke-mi:20140507080656p:plain