ggplot2を使って、散布図を作る-6
R グラフィックス クックブック 15回目
ggplot2パッケージを利用して、散布図を作成していきます。
変数の量を点の面積で表現したり、変数組み合わせを表現します。
変数の量を点の面積で表現する
変数の量を点の面積で表現したグラフは、
バブルチャート/バルーンプロットと呼ばれています。
点の面積を、比較しやすい様なデータをこしらえます。
exampleData <- data.frame("Bar" = factor(c("a","b","c","d","e","f")), "Hoge" = c(1,2,3,4,5,6), "Piyo" = c(1,2,3,1,2,3), "Foo" = c(10,50,100,20,75,5)) > str(exampleData) 'data.frame': 6 obs. of 4 variables: $ Bar : Factor w/ 6 levels "a","b","c","d",..: 1 2 3 4 5 6 $ Hoge: num 1 2 3 4 5 6 $ Piyo: num 1 2 3 1 2 3 $ Foo : num 10 50 100 20 75 5
Foo列を点の面積(size)に指定して、散布図を作成します。
p <- ggplot(exampleData, aes(x=Hoge,y=Piyo,size=Foo)) + geom_point(shape=21, colour="blue",fill="skyblue") p
このsizeに指定する方法は、点の半径に、変数の量がマッピングされます。
そのため、変数の量が2倍になると、点の面積が4倍大きくなり、
視覚的に訴えるには、よろしくない状況です。
そこで、scale_size_area()を使って、きちんと面積にマッピングします。
p + scale_size_area(max_size=15)
これで、変数の量の大小と、点の面積の大小が、正しく捉える事ができます。
ここまでは、x軸/y軸共に、連続値のデータを扱いました。
ここからは、離散値のデータを扱っていきます。
R: Hair and Eye Color of Statistics Studentsのデータを使います。
性別ごとに、髪と目の色が集計されています。
> HairEyeColor , , Sex = Male Eye Hair Brown Blue Hazel Green Black 32 11 10 3 Brown 53 50 25 15 Red 10 10 7 7 Blond 3 30 5 8 , , Sex = Female Eye Hair Brown Blue Hazel Green Black 36 9 5 2 Brown 66 34 29 14 Red 16 7 7 7 Blond 4 64 5 8
上のデータを、性別ごとの区分けを無くし、フォーマットを変換します。
#性別ごとに分かれているデータを足すことで、1つにする > hec <- HairEyeColor[,,"Male"] + HairEyeColor[,,"Female"] > hec Eye Hair Brown Blue Hazel Green Black 68 20 15 5 Brown 119 84 54 29 Red 26 17 14 14 Blond 7 94 10 16 #wideフォーマットを、longフォーマットにする > library(reshape2) > hec <- melt(hec,value.name = "count") > hec Hair Eye count 1 Black Brown 68 2 Brown Brown 119 3 Red Brown 26 4 Blond Brown 7 5 Black Blue 20 6 Brown Blue 84 7 Red Blue 17 8 Blond Blue 94 9 Black Hazel 15 10 Brown Hazel 54 11 Red Hazel 14 12 Blond Hazel 10 13 Black Green 5 14 Brown Green 29 15 Red Green 14 16 Blond Green 16
散布図を作ります。
ggplot(hec,aes(x=Eye, y=Hair))+ geom_point(aes(size=count), shape=21, colour="black",fill="cornsilk") + scale_size_area(max_size=20, guide=FALSE)
組み合わせの大小が分かりやすくて、良いですね。
注釈として、countを表示してみます。
上のグラフ + geom_text(aes(label=count))
逆に分かりづらくなってしまいました。
注釈を表示するには、テキストの位置や、文字色を考慮する必要があります。
#テキストのy軸位置は、試行錯誤です #y軸のHairの位置と、円の半径と線形である面積の平方根値から、もじょもじょします。 上のグラフ + geom_text(aes(y=as.numeric(Hair)-sqrt(count)/30,label=count),colour="grey60",size=4)
この様に、点の面積より目立たせない工夫が必要ですね。
変数の組み合わせを表現する
複数の変数を組み合わせて表現するためには、散布図の行列を使います。
こんなデータを使います。
国ごとのGDPや、健康のために費やす費用、乳幼児の死亡率です。
> str(c2009) 'data.frame': 11016 obs. of 5 variables: $ Name : Factor w/ 216 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ... $ GDP : num 55.6 55.7 54.4 73.2 76.4 ... $ laborrate : num NA NA NA NA NA NA NA NA NA NA ... $ healthexp : num NA NA NA NA NA NA NA NA NA NA ... $ infmortality: num NA NA NA NA NA NA NA NA NA NA ...
散布図の行列を作るには、Rの基本グラフィックスに含まれるpairs()を使います。
ggplot2じゃなくなっちゃった。。。
#Name列を除外するため、2列目~5列目を指定しています。 pairs(c2009[,2:5])
それぞれの散布図で、x軸とy軸のスケールがどこに記載されているか注意が必要ですね。
変数間の相関が分からない場合は、とりあえずで見ることができますね。
たった1行のコードから、パッ見で変数間の関係性が想像できます。
GDPとhealthexpは関係が強そう や
infmortalityとGDPの関係 と infmortalityとhealthexpの関係は似ている など。
このpairs()で作られる散布図の行列ですが、
対角線上、対角線より上、対角線より下を分けてカスタマイズできます。
pairs()のヘルプページのExampleに記載されています。
#事前に、panel.cor()/panel.hist()/panel.lmが作られてること pairs(c2009[,2:5], pch=".", upper.panel = panel.cor, #対角線より上 diag.panel = panel.hist, #対角線上 lower.panel = panel.lm #対角線より下 )
上のグラフは、それぞれのパネルで下記を表現しています。
- 対角線より上: 相関係数
- 対角線上: データの分布(ヒストグラム)
- 対角線より下: 線形のモデル
散布図については、この記事が最後になりますが、6回も費やしました。
棒グラフ/折れ線グラフと比較して、散布図は、表現できる変数が多いですね。
次は、今まで作成したきたグラフに着目して、
Power BI と Rで作るグラフを比較していきたいと思います。
powerbi.microsoft.com