ggalluvialパッケージを使ってみた

#読む前に

これはアホがやらかす記事となっております。皆様そこのところご了承の上、お読みください。

#はじめに
　Rパッケージ紹介ブログとして名高いブログからだにいいものを見ていたら、この記事(https://www.karada-good.net/analyticsr/r-504) を見つけた。前にmetasub関連で読んだこの論文（https://www.cell.com/cell-systems/fulltext/S2405-4712(15)00002-2?_returnURL=https%3A%2F%2Flinkinghub.elsevier.com%2Fretrieve%2Fpii%2FS2405471215000022%3Fshowall%3Dtrue )のFigure6で沖積図があったことを思い出し、自分で描いてみたくなったため行った。



#実行環境
MacBook Pro(15-inch,2018)
プロセッサ　2.9 Ghz Intel Core i9
メモリ 32GB 2400 MHz DDR4
OS:macOS Mojave(ver.10.14.6)


```{R}
> sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Mojave 10.14.6

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggalluvial_0.12.3 ggplot2_3.3.2    

```

Rstudioバージョン

RStudio Version 1.3.1093

#試してみる

日本語記事でggalluvialパッケージを扱っている記事は、前述の記事とこのnote( https://note.com/bilgekeel/n/n81ea328fb988 )である。取り敢えずは前述の「からだにいいもの」の記事を参考にグラフを描いてみる。

```{R}
#パッケージの読み込み
library("ggalluvial")
 
###データ例の作成#####
n <- 30
TestData <- data.frame(Group = sample(paste0("Group", 1:3), n, replace = TRUE),
                       Judge = sample(c("Yes", "No"), n, replace = TRUE),
                       Device = sample(c("Pc", "Mobile", "Tablet"), n, replace = TRUE),
                       Freq = sample(0:50, n, replace = TRUE))
########
 
#帯グラフをプロット:geom_alluviumコマンド
#出現頻度を指定:freqオプション
#x軸方向の項目を指定:axisXオプション;項目数はXに数字で指定
AlluviumPlot <- ggplot(TestData, aes(freq = Freq, axis1 = Group,
                                     axis2 = Judge, axis3 = Device)) +
#帯グラフのプロット
#aesにfill,alpha,colorの設定が可能,項目をまたぐときは:を使用
geom_alluvium(aes(fill = Group:Judge, color = Device))
#プロット
AlluviumPlot
 
#棒グラフをプロット:geom_stratumコマンド
#出現頻度を指定:freqオプション
#x軸方向の項目を指定:axisXオプション;項目数はXに数字で指定
StratumPlot <- ggplot(TestData, aes(freq = Freq, axis1 = Group,
                                    axis2 = Judge, axis3 = Device)) +
#棒グラフのプロット
geom_stratum() +
#テキストを追加
#statオプションに"stratum"を指定
geom_text(stat = "stratum")
#プロット
StratumPlot
 
#geom_alluviumとgeom_stratumコマンドの組み合わせ
ggplot(TestData, aes(freq = Freq, axis1 = Group,
                     axis2 = Judge, axis3 = Device)) +
geom_alluvium(aes(fill = Group:Judge, color = Device)) +
geom_stratum() +
geom_text(stat = "stratum")
 
#facet_wrapコマンドを使用
ggplot(TestData, aes(freq = Freq, axis1 = Group, axis2 = Judge)) +
geom_alluvium(aes(fill = Group:Judge, color = Device)) +
geom_stratum() +
geom_text(stat = "stratum") +
facet_wrap(~ Device, scales = "free_y") +
scale_x_continuous(breaks = 1:2, labels = c("Group", "Judge"))
```


結果

```{R}

Group:Judge でエラー:  引数が NA/NaN です 
 追加情報:  警告メッセージ: 
1:  Group:Judge で: 
   数値式は 30 個の要素を持っています: 最初の要素だけが使われました 
2:  Group:Judge で: 
   数値式は 30 個の要素を持っています: 最初の要素だけが使われました 
3:  FUN(X[[i]], ...) で:   強制変換により NA が生成されました 
4:  FUN(X[[i]], ...) で:   強制変換により NA が生成されました 

```

エラーメッセージの嵐になった(T T)。

では気を取り直してnoteの方でやってみるぞ。


```{R}
data <- data.frame(
	breakfast	=c("Rice","Rice","Rice","Rice","Rice","Rice",
			"Bread","Bread","Bread","Bread","Bread","Bread"),
	Side		=c("Egg","Egg","Egg","Bacon","Bacon","Bacon",
			"Egg","Egg","Egg","Bacon","Bacon","Bacon"),
	Drink		=c("Tea","Coeffee","Water","Tea","Coeffee","Water",
			"Tea","Coeffee","Water","Tea","Coeffee","Water"),
	freq		=c(3,0,2,1,0,2,2,4,3,3,2,4)
);

#install.packages("ggalluvial")	#ggalluvial のインストール
library(ggalluvial)
library(ggplot2)
ggplot(data,
	aes(y=freq,
		axis1	=	breakfast,
		axis2	=	Side,
		axis3	=	Drink,
	)
)+geom_alluvium(
     aes(fill = breakfast),
#     　width        =	0,		#軸間同士の距離
#     knot.pos     =	1/6,		#沖積層のカーブの滑らかさ
     reverse      =	FALSE		#沖積層の上下反転
)+guides(
		fill	=	FALSE
) + geom_stratum(
     width        =  1/4.5 ,		#地層帯の横幅
     reverse      =  FALSE,		#地層帯の上下反転
     color        = "#222222"
) + geom_text(
     stat         = "stratum",
     label.strata =  TRUE,
     reverse      =  FALSE
) + scale_x_continuous(
     breaks       =  1:3,				#地層帯の数
     labels       =  c("主食", "おかず", "飲み物")	#横軸のラベル名
#) + coord_flip(                                #グラフの縦横の転地 
) + ggtitle("Alluvial:朝食"
)+
theme_bw(base_family = "HiraKakuProN-W3")#この部分はRstudioの日本語文字化け対策
```

取り敢えずコピペ。

結果

![201229-ggalluvial-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398478/4dd30a33-0ec8-363f-262a-3a40cef21c01.png)

何故や。グラフに文字が入らへんぞ…。おかしいなあ。

ここで出てきたエラーメッセージを読んでみる。

```{R}
警告メッセージ: 
Computation failed in `stat_stratum()`:
The parameter `label.strata` is defunct.
use `aes(label = after_stat(stratum))`. 
```

うん、分からないw。

とにかく`label.strata` is defunct.と書いているから、機能が廃止になったことはわかる。

と言ってもどう使えば良いのか分からないので、公式の使い方（https://cran.r-project.org/web/packages/ggalluvial/vignettes/ggalluvial.html を見てみることにする。

ここでやってみたい図のコードを見つける。

```{R}
ggplot(as.data.frame(Titanic),
       aes(y = Freq,
           axis1 = Survived, axis2 = Sex, axis3 = Class)) +
  geom_alluvium(aes(fill = Class),
                width = 0, knot.pos = 0, reverse = FALSE) +
  guides(fill = FALSE) +
  geom_stratum(width = 1/8, reverse = FALSE) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum)),
            reverse = FALSE) +
  scale_x_continuous(breaks = 1:3, labels = c("Survived", "Sex", "Class")) +
  coord_flip() +
  ggtitle("Titanic survival by class and sex")

```

![Titanic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398478/9cb4b030-b49f-3cee-022f-8c13a16a5b39.png)

`aes(label = after_stat(stratum))`の部分及びこのコードと上のエラーが出たコードを比較してみる。

すると

```{R}
geom_text(
     stat         = "stratum",
     label.strata =  TRUE,
     reverse      =  FALSE
) 
```

が

```{R}
geom_text(
     stat         = "stratum",
     aes(label = after_stat(stratum)),
     reverse      =  FALSE
) 
```
となることが分かる。

![201229allubialplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398478/88f4dcf2-07b1-b14d-0c8e-1936586693db.png)

やったね！（テイルズの声で）

#最後に

コードをまとめる

```{R}

library(ggalluvial)
library(ggplot2)

data <- data.frame(
  breakfast	=c("Rice","Rice","Rice","Rice","Rice","Rice",
               "Bread","Bread","Bread","Bread","Bread","Bread"),
  Side		=c("Egg","Egg","Egg","Bacon","Bacon","Bacon",
           "Egg","Egg","Egg","Bacon","Bacon","Bacon"),
  Drink		=c("Tea","Coeffee","Water","Tea","Coeffee","Water",
            "Tea","Coeffee","Water","Tea","Coeffee","Water"),
  freq		=c(3,0,2,1,0,2,2,4,3,3,2,4)
)

#install.packages("ggalluvial")	#ggalluvial のインストール


g<-ggplot(data,
       aes(y=freq,
           axis1	=	breakfast,
           axis2	=	Side,
           axis3	=	Drink,
       )
       )+theme_bw(base_family = "HiraKakuProN-W3")

g<-g+geom_alluvium(
  aes(fill = breakfast),
  #     　width        =	0,		#軸間同士の距離
  #     knot.pos     =	1/6,		#沖積層のカーブの滑らかさ
  reverse      =	FALSE		#沖積層の上下反転
)
g
g<-g+guides(
  fill	=	FALSE
) 

g<-g+geom_stratum(
  width        =  1/4.5 ,		#地層帯の横幅
  reverse      =  FALSE,		#地層帯の上下反転
  color        = "#222222",
) + geom_text(
  stat         = "stratum",
  aes(label = after_stat(stratum)),
  reverse      =  FALSE,
) + scale_x_continuous(
  breaks       =  1:3,				#地層帯の数
  labels       =  c("主食", "おかず", "飲み物")	#横軸のラベル名
  #) + coord_flip(                                #グラフの縦横の転地 
) + ggtitle("Alluvial:朝食"
)

```

何かあればご指摘ください。