#読む前に
これはアホがやらかす記事となっております。皆様そこのところご了承の上、お読みください。
#はじめに
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の日本語文字化け対策
取り敢えずコピペ。
結果
何故や。グラフに文字が入らへんぞ…。おかしいなあ。
ここで出てきたエラーメッセージを読んでみる。
警告メッセージ:
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")
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
)
となることが分かる。
やったね!(テイルズの声で)
#最後に
コードをまとめる
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:朝食"
)
何かあればご指摘ください。