📊

【R】for文を使って複数のbeeswarm plotを一気に描く

2023/11/29に公開

環境

Windows10
R 4.3.1
Rstudio

概要

同じプロットをたくさん描く必要に迫られたが、毎回変数を入力して描画するのはとても面倒。というか100個とか無理。
for文というもので一気に描画できるらしいので、紹介します。

データの読み込み

おなじみirisを使用します。
inputの詳細はこちら↓
https://zenn.dev/ykyk_wet/articles/1762575db23fa2

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のところはめちゃくちゃ調べたので参考サイトをぜひとも読んでいただきたい。
ありがとう先人の方々。。。

参考

https://qiita.com/ryotenabe/items/a35ffdae762254367b82
https://eo-on.blogspot.com/2014/10/ggplotfor.html
https://qiita.com/hoxo_m/items/0dd082c3a8ed017a9b73

Discussion