Rで美しいグラフを描きたい!
ggplot2を使ってグラフを描きたいけれど、よくわからない!
そんなお悩みを解決します。
グラフ作成の準備
tidyverseパッケージのインストール、ロード
ggplot2はggplot2パッケージをロードすることでR上で使えるようになります。
ただ、ggplot2はtidyverseパッケージをロードすると一緒にロードされます。tidyverseのほうがいろいろ便利な関数も一緒にロードできるのでtidyverse推奨です。
# tidyverseをインストールしていない人はインストールする
install.packages("tidyverse")
# インストール済みの人はtidyverseをロードする
library(tidyverse)
Rのオススメ本
tidyverseパッケージを使ったオススメの実践入門書を紹介します。データの前処理や分析、可視化(ggplot2)が学べるのでとてもオススメ!
Rを使ってもっとデータ分析をしてみたい!と思わせてくれる一冊です。
散布図の書き方
では、ggplot2パッケージに入っているmpgデータセットを使って実際にグラフを作っていきます。mpgデータセットは、tidyverseをインストールされた人であれば誰でもR上で使えます。
なお、mpgは"1999年から2008年までの人気車種38車種の燃費データ"のデータセットです。
# mpgデータセットの内容
> head(mpg)
# A tibble: 6 × 11
manufacturer model displ year cyl trans drv cty hwy
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int>
1 audi a4 1.8 1999 4 auto(l5) f 18 29
2 audi a4 1.8 1999 4 manual(m5) f 21 29
3 audi a4 2 2008 4 manual(m6) f 20 31
4 audi a4 2 2008 4 auto(av) f 21 30
5 audi a4 2.8 1999 6 auto(l5) f 16 26
6 audi a4 2.8 1999 6 manual(m5) f 18 26
# … with 2 more variables: fl <chr>, class <chr>
では、xがdispl(排気量)、yがhwy(走行距離)の散布図を作ってみます。
# データセットはmpg, xはdispl, yはhwyで散布図を作成する
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point()
ggplot2の一番簡単なグラフが作成できました。
プロットの色変更や形の変更、軸の調整や変更、タイトルを入れたりなどの装飾も、レイヤーの追加によって行なっていきます。
プロットの色、形、サイズを変更する方法
プロットの色、形、サイズは、geom_pointの中でcolor, shape, sizeを指定することで変更できます。
この時、すべてのプロットに対して色や形、サイズを変更したい場合は、mapping = aes()の"外"で指定します。なお、aesはaesthetic(エステティック)の略です。
では、colorは赤色、shapeは三角、sizeは4でグラフ化してみます。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(color = "red",
shape = "triangle",
size = 4)
プロットのcolorはred, shapeは三角、サイズが4のグラフができました!
私はRを使うまではExcel魔人でしたが、Rでグラフを初めて書いた時は簡単に美しい図が描けることに感動しました。
水準ごとに色、形、サイズを変更する方法
指定したxとyに対し水準ごとに色や形を変えたい場合は、mapping = aes()の"中"でcolorやshapeを指定します。
では、year(年式)ごとでcolorとshapeを分けて描いてみます。この時、指定する変数はfactor型にする必要があるのでfactor(year)とします。sizeは全部同じサイズでいいので、aesの"外"で指定します。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(aes(color = factor(year),
shape = factor(year)),
size = 4) #サイズは全部同じでいいのでaesの"外"
若干プロットサイズが大きいですが、年式(2008年と1999年)で色と形を分けることができました。
色はRが勝手につけてくれます。個人的にはエクセルよりずっと色のセンスはいいです。
ちなみにもしfactor型に指定していなかったら以下のようになります。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(aes(color = year), # factor型にしなかった場合
size = 4)
factor型になっていない場合、yearが連続変数として見なされてしまいます。
そのため、年式は1999と2008の2つのデータしかないのに、凡例が1999から2008までの連続した数値で色付けされてしまって、思っていたのと違うグラフが完成してしまいます。
また、shapeは連続変数は受け付けないためエラーが出ます。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(aes(color = year,
shape = year),
size = 4)
Error in `scale_f()`:
! A continuous variable can not be mapped to shape
このようなエラーが出たら、factor型以外の変数を入れてしまっていないかチェックしましょう。
色味(パレット)を変更する方法
colorを設定すると、Rが自動で綺麗な色をつけてくれましたね。
自動でつけられた色ではなく、別の色味にしたい場合は、scale_color_brewer()を追加することでパレットを指定することができます。
では、"Set1"のパレットを使ったグラフを書いてみます。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(aes(color = factor(year),
shape = factor(year)),
size = 4)+
scale_color_brewer(palette = "Set1")
グレースケールに変更する方法
グレースケールにしたい場合は、scale_color_greyを使います。
色加減は、水準数に合わせてRが自動でつけてくれます。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(aes(color = factor(year),
shape = factor(year)),
size = 4)+
scale_color_grey()
自動ではなく、手動で設定したい場合は、scale_color_grey()のstartとendで調整します。
1が白色、0が黒色で、水準数に合わせて調整されるので、白色を入れたくない場合は1でなく0.7などにしてみるといいです。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(aes(color = factor(year),
shape = factor(year)),
size = 4)+
scale_color_grey(start = 0.7, end = 0)
また、startとendの値を逆にすると、カラーリングを反転させることができます。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(aes(color = factor(year),
shape = factor(year)),
size = 4)+
scale_color_grey(start = 0, end = 0.7)
重なったプロットがある場合の対処法
同じ点にプロットが重なっている場合は、透過度(透明度)を設定します。
透過度はgeom_pointのalphaを設定します。
alphaは0から1までの値で、0に近づくほど透明度が上がります。
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy))+
geom_point(aes(color = factor(year),
shape = factor(year)),
size = 4,
alpha = 0.3)
色が濃いプロットが重なっているところです。意外とありましたね。
異なるデータフレームのグラフを追加する方法
グラフを書いた後に、
違うデータフレームのグラフも同じグラフに載せたいなぁ...
と思うこともあると思います。そのやり方についてご紹介します。
本記事の"ggplot2の基本コマンド"で、ggplot2()の中に入れたデータは、その後で追加するレイヤすべてで反映されるとご紹介しました。
ということは、ggplot()の中でデータを指定すると、異なるデータセットのグラフを書くことができなくなってしまいます。よって、1つのグラフに異なるデータセットを載せる場合は、ggplot()内にデータは入れず、個々のレイヤでデータセットを指定する必要があります。
では、実践してみます。
mpgデータセットを少し変えたmpg2データセットを作り、それぞれ同じグラフに載せてみることにします。
まずはmpg2データセットの作成をします。
mpg2データセットは、displはそのままの値、hwyのみ1.2倍しました。
# mpg2データセットを作る
mpg2 <- data.frame(displ2 = mpg$displ,
hwy2 = mpg$hwy * 1.2)
head(mpg2)
> head(mpg2)
displ2 hwy2
1 1.8 34.8
2 1.8 34.8
3 2.0 37.2
4 2.0 36.0
5 2.8 31.2
6 2.8 31.2
では、mpgとmpg2の二つのデータフレームのdisplとhwyについて同じグラフに載せます。
赤色がmpgデータセット、青色がmpg2データセットのグラフです。
ggplot()+
geom_point(data = mpg,
aes(x = displ,
y = hwy),
color = "red")+
geom_point(data = mpg2,
aes(x = displ2,
y = hwy2),
color = "blue")
異なるデータフレームの散布図を同じグラフ上で書くことができました。
ggplot()内ではデータ指定はせず、
・1つ目のgeom_pointでmpgの散布図レイヤー
・2つ目のgeom_pointでmpg2の散布図レイヤー
を作ることで、異なるデータフレームをひとつのグラフにまとめて載せることができます。
異なるデータフレームで、変数名が同じの場合は?
異なるデータフレームで変数名が同じの場合、ggplotの中でxとyを指定して、geom_point散布図レイヤーでdataを指定することでグラフを描くことができます。
もちろん先ほどのように、geom_pointの中でそれぞれxとyを指定してもOKですが、ggplotの中でxとyを指定した方がコードが簡略化できます。
ggplot(mapping = aes(x = displ, y = hwy))+
geom_point(data = mpg)+
geom_point(data = mpg3)
まとめ: Rで散布図を書く場合はgeom_pointを使う
ここまでで、ggplot2を使った散布図の書き方について紹介しました。
散布図が書けたら、次は回帰直線を引く方法について知りたい方はこちらをご確認ください。
本記事のまとめ
- ggplot()内で指定したデータセットやx, yは、追加したレイヤすべてで反映される
- 散布図の作成はgeom_pointで行う
- プロットの色、形、サイズの変更は、color, shape, sizeを指定する。
この時、mapping = aes()の外で指定すると全水準(全プロット)に反映される - 水準ごとに色や形を変更する場合は、mapping = aes()の中で指定する
- グラフの色味(パレット)の変更は、scale_color_brewerで行う
- 異なるデータセットのグラフを追加する場合は、geom_point内でデータセットを指定する。
この記事がどなたかのお役に立ちますように!
R言語の勉強におすすめの本
今後Rの勉強をしていきたい!という方に、こちらの参考書がおすすめです。
特に、RユーザのためのRStudio実践入門は、tidyverseパッケージに特化して書かれていてとても実用的でしたのでオススメです。私自身、この本を読んでRで出来ることが一気に増えた実感のある本です。kindleで試し読みもできるのでぜひ参考にしてください。