LoginSignup
2
2

More than 3 years have passed since last update.

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

Posted at

読む前に

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

はじめに

 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)

> 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 )である。取り敢えずは前述の「からだにいいもの」の記事を参考にグラフを描いてみる。

#パッケージの読み込み
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"))

結果


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の方でやってみるぞ。

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

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

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

警告メッセージ: 
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 を見てみることにする。

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

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

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

すると

geom_text(
     stat         = "stratum",
     label.strata =  TRUE,
     reverse      =  FALSE
) 

geom_text(
     stat         = "stratum",
     aes(label = after_stat(stratum)),
     reverse      =  FALSE
) 

となることが分かる。

201229allubialplot.png

やったね!(テイルズの声で)

最後に

コードをまとめる


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:朝食"
)

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2