R ggplot でループを利用した散布図（scatter plot）を描きpdf出力したかったのです




###イントロ

baseplot を始めとしたパッケージで相関図のための散布図（scatter plot）を描こうと思えば、便利なlibraryが幾つかあります。
下記に代表的な例を示します。

GGally(ggpairs)やPerformanceAnalytics, psychなどです。
[美しいペアプロット図を簡単に作る（teramonagiさま）](http://d.hatena.ne.jp/teramonagi/20130412)
　
[R package for identifying relationships between variables （stats.stackexchange）](http://stats.stackexchange.com/questions/14108/r-package-for-identifying-relationships-between-variables)

ですが、沢山の相関図を描きたいときには、図が小さくなってしまいます。
そこで、一枚一枚を描き出すプログラムを書いて見たかったのです。


###スクリプトコード
今回、`ggplot`と`for`文，`combn`関数を用いて次のようはスクリプトコードを書きました。
（データは、irisデータです）

```R:scatterplot_of_iris.R
#iris data scatter plot with combn
library(ggplot2)　#ggplot libraryの読み込み
d <- combn(colnames(iris[1:4]), 2) # iris combn#カラム行の名前を取り出すことと、combnで組み合わせ
pdf(file="scatterplot_iris_combn.pdf", paper="a4r", width=11.6,height=8.2)
for (i in 1:6){
  p <- ggplot(iris, aes(x=iris[,d[1,i]], y=iris[,d[2,i]], col= Species)) +
    geom_point(size = 6.5, alpha= 0.3) +
    xlab(d[1,i]) + ylab(d[2,i])+
    ggtitle(paste("x-axis:", d[1,i], "VS  y-axis:", d[2,i], "(page",i,"/6)"  ) )
  print(p)
}
dev.off()
```

###できあがり
スクリーンショットを上げます。
（薄くてゴメンナサイ＞＜）
　　
1, 2 ページ目
![スクリーンショット 2016-04-12 13.31.20.png](https://qiita-image-store.s3.amazonaws.com/0/22082/5b69028a-4a50-6c3e-c668-d446292b65fa.png)

3, 4 ページ目
![スクリーンショット 2016-04-12 13.31.13.png](https://qiita-image-store.s3.amazonaws.com/0/22082/d0be98a5-be2a-d766-b3fc-8be1a291200c.png)

5, 6 ページ目
![スクリーンショット 2016-04-12 13.31.02.png](https://qiita-image-store.s3.amazonaws.com/0/22082/4599f72d-1ebd-7c66-a330-bea9365aefc6.png)

6ページ目拡大図
![スクリーンショット 2016-04-12 13.31.44.png](https://qiita-image-store.s3.amazonaws.com/0/22082/9ed0ce8f-dd9f-d601-88e4-f6e423c32ba4.png)



###簡単な説明（combnで操作した変数について）


`d <- combn(colnames(iris[1:4]), 2)`
dはcombn関数によって生成された行列です。
`ggplot(iris, aes(x=iris[,d[1,i]], y=iris[,d[2,i]], col= Species))`
では、ベクトルを入れ子にしています。
　　
このグラフを描くにあたって欲しかった(x,y)のペアは、次の6種類です。
(iris[,1],iris[,2])　(iris[,2],iris[,3])
(iris[,1],iris[,3])　(iris[,2],iris[,4])
(iris[,1],iris[,4])　(iris[,3],iris[,4])

列名で書くならば、
(iris[,"Sepal.Length"], iris[,"Sepal.Width"])
(iris[,"Sepal.Length"], iris[,"Petal.Length"])
･･･（略）---
(iris[,"Petal.Length"], iris[,"Petal.Width"])
です。
これらは、高校数学のコンビネーション、組み合わせのCの記号にあたるによって表記できますよね。
そこでcombnというものを使いました。次のサイトを参照しました。
[Rで階乗・順列・組み合わせを計算する](http://blog.livedoor.jp/green_idea/archives/1532165.html)

`combn`関数を利用して相関係数を求めた記事があります。
`combn`関数での利用の結果の詳細は、順番が前後するのですが、次の記事を御覧ください。

[Rで、多量の相関係数を求めて、相関係数の値の絶対値を求めるところまで。（説明と実行結果）](http://qiita.com/ryotenabe/items/e0fd789d0ca52e5712ce#説明と実行結果)


###簡単な説明（geom_pointについて）
また、
`geom_point(size = 6.5, alpha= 0.3)`
の部分は、irisデータでは、２個以上に同じ(x,y)の組があり、重なっている点があるようなので、alphaで、半透明度を0.3にしました。図で見ると、色の濃い部分が重なり合っているところです。


###簡単な説明（ラベルやタイトルについて）

`xlab(d[1,i]) + ylab(d[2,i])`
x軸のラベル、y軸のラベルを設定します。
`d <- combn(colnames(iris[1:4]), 2)`
としていますので、カラム名を出せます。

`ggtitle(paste("x-axis:", d[1,i], "VS  y-axis:", d[2,i], "(page",i,"/6)"  ) )`

１ページごとに、グラフの内容が変わるように、描いています。
ggtitleで、何が来ているかは、x軸のラベル、y軸のラベルを設定と同じように行います。


こんな感じです。

###動作環境

環境は、Mac 10.10.5, R 3.23, Rstudio 0.99.840
でしたっ。

###ggplotとforループについて、参考となる記事です。
[ggplot2でplot()的な複数グラフ表示とその闇](http://qiita.com/sazya/items/ab641eb589a1d4d375db)
ggplot2でforループを使ったplot()的な複数プロットするとき…