Rで解析:「ggplot2」の体裁を色々整える「ggh4x」パッケージ


投稿日: Rの解析に役に立つ記事

「ggplot2」パッケージの「facet_wrap」や「facet_grid」コマンドを使いやすくするだけでなく、軸や凡例の体裁を色々整えることが可能なパッケージの紹介です。「ggplot2」パッケージ単独でも体裁を整えることが可能ですが、本パッケージを利用することで大幅な作業時間を短縮できると考えます。

パッケージバージョンは0.2.3。windows11のR version 4.2.2で確認しています。

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("ggh4x")

実行コマンドの紹介

詳細はコマンド、パッケージのヘルプを確認してください。

#パッケージの読み込み
library("ggh4x")

###データ例の作成#####
#tidyverseパッケージがなければインストール
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}

set.seed(1234)
n <- 50
TestData <- tibble(Group = sample(paste0("Group ", 1:2), n, replace = TRUE),
                   SubGroup = sample(paste0("SubGroup ", 1:3), n, replace = TRUE),
                   Data_X = 1:n,
                   Data_Y = rnorm(n))
########

###基準プロットの作成#####
TestPlot <- ggplot(TestData, aes(x = Data_X, y = Data_Y, color = Group)) +
  geom_point() +
  theme(axis.line = element_line(colour = "black"))
#####

#ggplot::facet_wrapの拡張:facet_wrap2コマンド
#facetsの条件を指定:facetsオプション;varsコマンドを使用して設定
#並べる行数,列数を設定:nrow,ncolオプション
#軸の固定方法:scalesオプション;"fixed","free_x","free_y","free"
#軸の表示設定:axesオプション;"margins","x","y","all"
#軸ラベルの表示設定:remove_labelsオプション;"none","x","y","all"
#axesオプションの軸に適応されます
#プロット方向:dirオプション;"h","v"
TestPlot +
  facet_wrap2(facets = vars(Group), nrow = NULL, ncol = NULL,
              scales = "free", axes = "margins",
              remove_labels = "none",
              shrink = TRUE, dir = "v")

#ggplot::facet_gridの拡張:facet_grid2コマンド
#オプションの多くはfacet_wrap2コマンドと共通
#列方向の分割指標:rowsオプション;varsコマンドを使用して設定
#行方向の分割指標:colsオプション;varsコマンドを使用して設定
TestPlot +
  facet_grid2(rows = vars(Group), cols = vars(SubGroup),
              scales = "fixed", space = "fixed",
              axes = "margins", remove_labels = "none")

#入れ子のfacetプロット:facet_nestedコマンド
#ラベルの位置を指定:switchオプション;"x","y","both"
TestPlot +
  facet_nested(~ Group + SubGroup, 
               nest_line = element_line(linetype = 2,
                                        colour = "blue"),
               switch = "y")

#レイアウトを指定してプロット:facet_manualコマンド
#レイアウトをmatrixで指定する
design <- matrix(c(1,2,1,2), 2, 2)
#プロット
TestPlot +
  facet_manual(vars(Group), design = design)

#こんな使い方も出来ます
#レイアウトを文字と#(空白)で指定する
#改行で行を切り替える
design <- "
A#
#B
"
#プロット
TestPlot +
  facet_manual(vars(Group), design = design,
               heights = unit(c(4, 3), "cm"),
               widths = unit(c(6, 3), "cm"))

#各コマンドのstripオプションに体裁を適応する:strip_themedコマンド
TestStrip <- strip_themed(
  #水平方向の体裁
  #listで各ラベルの色を設定可能:fill,color
  background_x = 
    list(element_rect(fill = "dodgerblue"),
         element_rect(fill = "green"),
         element_rect(fill = "white")),
  text_x = elem_list_text(colour = "black",
                          face = "bold"),
  #by_layer_xオプション:FALSE:異なる要素を個々に適応
  by_layer_x = FALSE,
  #垂直方向の体裁
  background_y = elem_list_rect(
    fill = c("gold", "red")
  ),
  text_y = elem_list_text(angle = c(0, 45)),
  #by_layer_yオプション:FALSE:異なる要素を個々に適応
  by_layer_y = TRUE
)

#プロット
TestPlot +
  facet_grid2(rows = vars(Group), cols = vars(SubGroup),
              scales = "fixed", space = "fixed",
              axes = "margins", remove_labels = "none",
              strip = TestStrip)

#facet_gridの各パネルサイズを調整:force_panelsizesコマンド
#列方向のサイズ:colsオプション
#行方向のサイズ:rowsオプション
#行列の比率を連動:respectオプション;TRUE/FALSE
TestPlot +
  facet_grid(Group ~ SubGroup) +
  force_panelsizes(cols = c(1, 0.5, 0.8), 
                   rows = c(1, 3),
                   respect = FALSE)

###facet_grid後の各グループへ色を設定する:scale_colour_multiコマンド#####
#データの作成:SubGroup毎にデータを適応する
TestPlot <- ggplot(TestData, aes(x = Data_X, y = Data_Y, color = Group)) +
  geom_point(aes(SG1 = Data_X),
             data = ~ subset(., SubGroup == "SubGroup 1")) +
  geom_point(aes(SG2 = Data_X),
             data = ~ subset(., SubGroup == "SubGroup 2")) +
  geom_point(aes(SG3 = Data_X),
             data = ~ subset(., SubGroup == "SubGroup 3"))

#scale_colour_multiコマンド
#適応するデータ名を指定:aestheticsオプション
TestPlot +
  facet_wrap(~ SubGroup, scales = "free_x")+
  scale_colour_multi(
    aesthetics = c("SG1", "SG2", "SG3"),
    colours = list(c("black", "green"),
                   c("white", "blue"),
                   c("red", "blue")),
    guide = list(guide_colourbar(barheight = unit(35, "pt")))
  )

#凡例を文字の色で表示する:scale_colour_brewer/scale_fill_brewerコマンド
#guidesコマンドに適応するguide_stringlegendコマンドもあります
TestPlot +
  scale_colour_brewer(palette = "Dark2",
                      guide = "stringlegend")

###scale_x/y_continuousコマンドに適応して軸の体裁を整える#####
TestPlot +
  scale_x_continuous(
    #軸の書式を指定:guide_axisコマンド
    #sec.axisオプションと同時使用は不可
    #位置:positionオプション;"top","bottom","left","right"
    #ラベルの行/列数を指定:n.dodgeオプション
    #guide = guide_axis(position = "top", angle = 90,
    #                   n.dodge = 3),
    
    #第2軸を指定:dup_axisコマンド
    sec.axis = dup_axis(breaks = seq(from = 8, to = 45, by = 5),
                        guide = guide_axis(angle = 45)),
    
    #軸の色を設定:guide_axis_colorコマンド
    #「guides」コマンドの設定するguide_axis_truncatedコマンドもあります
    #軸の描写範囲を指定:trunc_lower/trunc_upperオプション
    guide = guide_axis_color(color = "red",
                             trunc_lower = unit(c(0.1, 0.3), "npc"),
                             trunc_upper = unit(c(0.2, 0.8), "npc"))
  ) 
########

出力例

・facet_wrap2コマンド

・facet_grid2コマンド

・facet_nestedコマンド

・facet_manualコマンド

・strip_themedコマンド

・force_panelsizesコマンド

・scale_colour_multiコマンド

・guide_axisコマンド


少しでも、あなたの解析が楽になりますように!!

スポンサードリンク

スポンサードリンク