📊
【R】for文を使って複数のbeeswarm plotを一気に描く
環境
Windows10
R 4.3.1
Rstudio
概要
同じプロットをたくさん描く必要に迫られたが、毎回変数を入力して描画するのはとても面倒。というか100個とか無理。
for文というもので一気に描画できるらしいので、紹介します。
データの読み込み
おなじみirisを使用します。
inputの詳細はこちら↓
irisデータをタブ区切りテキストファイルで出力しておいたので、これをRで読み込む。
data <- read.table("iris.txt", # ファイル名
header = TRUE, # 1行目は列名として扱う
sep = "\t") # タブ区切り
head(data) # データの確認
こうなってればok。
beeswarm plotを一気に描く
# 最初にライブラリの読み込み
library(ggplot2)
library(ggbeeswarm)
library(gridExtra)
plots <- list() # これから一気に描くplotの入れ物を作る
name <- names(data)[1:3] # 1列目から3列目までの列名を取りだす
head(name) # データの確認
本番
for(i in 1:length(name)){ # 1列目から描画したい列の最後までを対象
plots[[i]] <- ggplot(data,
aes_string(x = "Species", # x軸はSpeciesに固定
y = name[i])) + # Y軸を変化させていく
geom_boxplot(fill="white")+ # 箱ひげ図もつける
geom_beeswarm(aes(color = Species), # beeswarm plotはSpeciesごとに色を変更
size = 3,
cex = 2,
alpha =.5)+
ggtitle(name[i])+ # タイトルは各列名にする
theme_classic() } # ここは好きなテーマを選ぶ
plots[[1]] # ちゃんと書けてるか確認
ちゃんと描画できてた。
aesじゃなくて、aes_stringじゃないとダメみたい。
保存
一気に描画できたなら当然保存もまとめてしたい。
なんならplotを1つにまとめて保存したい。
args <- c(plots, list(ncol=3)) # 3列横並びに配置.行数を指定したいときはnrow
p <- do.call(grid.arrange, args) # do.callが大切みたい
ggsave("test.png", # サイズは適当
width = 20,
height = 7,
dpi = 300,
plot = p)
できた。
do.callのところはめちゃくちゃ調べたので参考サイトをぜひとも読んでいただきたい。
ありがとう先人の方々。。。
参考
Discussion