Rで解析:ggplot2で「プロット」 in 「プロット」のコマンド例


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

ggplot2で「プロット」 in 「プロット」を「tidyverse」、「gridExtra」、「grid」、「gtable」の4パッケージを利用した「散布図の一部を拡大して追加」、「散布図内にBoxPlotを追加」、「散布図内に表を追加」のコマンド例です。

日本語の情報があまり見当たらなかったので、簡単な紹介ですが何かの参考になればと思います。なお、ggplot2の体裁を整えるパッケージは「cowplot」パッケージが便利です。

パッケージバージョンは「tidyverse」1.3.1、「gridExtra」2.3、「grid」4.1.3、「gtable」0.3.0。実行コマンドはwindows 11のR version 4.1.3で確認しています。

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

下記コマンドを実行してください。「grid」パッケージはRに初期状態で含まれていますのでインストールの必要はありません。

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

実行コマンドの紹介

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

#パッケージの読み込み
library("grid")
library("tidyverse")
library("gridExtra")
library("gtable")

###データ例の作成#####
set.seed(1234)
n <- 50
TestData <- tibble(Group = sample(paste0("Group", 1:4), n,
                                  replace = TRUE),
                   X_Data = sample(c(1:50), n, replace = TRUE),
                   Y_Data = sample(c(51:100), n, replace = TRUE)) %>%
  #基本の散布図にプロットを追加する領域を作成
  #Y_Data >= 60 & X_Data <= 25でY_Dataに45:75をランダムで代入
  mutate(Y_Data = if_else(Y_Data >= 60 & X_Data <= 25,
                          sample(c(45:75), size = length(Y_Data),
                                 replace = TRUE),
                          Y_Data))
########

###基本の散布図を作成#####
PointPlot <- ggplot(TestData, aes(x = X_Data, y = Y_Data,
                                  col = Group)) +
  geom_point() +
  scale_color_manual(values = c("red", "#505457",
                                "#4b61ba", "#a87963")) +
  theme_bw()
  
#確認
PointPlot
########

###例えば散布図の一部を拡大して追加#####
#拡大する散布図範囲を指定
X_Min <- 20
X_Max <- 30
Y_min <- 60
Y_Max <- 70

#データを抽出
ExPoint <- TestData %>%
  filter(dplyr::between(X_Data, X_Min, X_Max) &
           dplyr::between(Y_Data, Y_min, Y_Max))

#拡大散布図を作成
##ggplot::ggplotGrobコマンド内にggplotコマンドを記述する##
BigPlot <- ggplotGrob(ggplot(ExPoint, aes(x = X_Data, y = Y_Data,
                                          col = Group, group = 1)) +
                        geom_line(show.legend = FALSE, col = "black") +
                        geom_point(show.legend = FALSE, size = 2) +
                        scale_color_manual(values = c("red", "#505457",
                                                      "#4b61ba", "#a87963")) +
                        theme_bw())
#追加
##拡大範囲はggplot::annotateコマンドを使用する##
##グラフはggplot::annotation_customコマンドを使用する##
PointPlot +
  annotate(geom = "rect", col = "red", fill = NA,
           xmin = X_Min, xmax = X_Max,
           ymin = Y_min, ymax = Y_Max) +
  annotation_custom(grob = BigPlot,
                    xmin = 0, xmax = 30,
                    ymin = 75, ymax = 97)

###例えば散布図内にBoxPlotを追加#####
#Group毎のY_DataのBoxPlotを作成
##ggplot::ggplotGrobコマンド内にggplotコマンドを記述する##
BoxPlot <- ggplotGrob(ggplot(TestData,
                             aes(x = Group, y = Y_Data,
                                 fill = Group)) +
                        stat_boxplot(show.legend = FALSE) +
                        scale_fill_manual(values = c("red", "#505457",
                                                     "#4b61ba", "#a87963")) +
                        labs(x = NULL, y = "Y_Data",
                             title = "Y_Data_BoxPlot") +
                        theme_dark())
#追加
##ggplot::annotation_customコマンドを使用する##
PointPlot +
  annotation_custom(grob = BoxPlot,
                    xmin = 0, xmax = 30,
                    ymin = 75, ymax = 97)
########

###例えば散布図内に表を追加#####
#Group毎のX_Data,Y_Dataの中央値の表を作成
TestTable <- TestData %>%
  group_by(Group) %>%
  summarise(X_Data = median(X_Data),
            Y_Data = median(Y_Data))

#表の作成
##gridExtraパッケージを使用する##
#表の体裁を設定gridExtra::ttheme_defaultコマンド
Table_T <- ttheme_default(core = list(bg_params = list(fill = c("red", "#505457",
                                                                "#4b61ba", "#a87963"),
                                                       col = NA, alpha = 0.8),
                                      fg_params = list(fontface = 1, fontsize = 10)),
                          colhead = list(bg_params = list(fill = "#92C2FF"),
                                         fg_params = list(fontface = 3,
                                                          fontsize = 9)))
#表の作成:gridExtra::tableGrobコマンド
TestTabele <- tableGrob(TestTable,
                        rows = NULL,
                        theme = Table_T)

#表Titleを追加
##grid::textGrobコマンドを使用する##
Title <- textGrob("Group_Median", gp = gpar(fontsize = 10))

#表にTitle行を追加
##gtable::gtable_add_rowsコマンドを使用する##
TestTabele <- gtable_add_rows(TestTabele,
                              heights = grobHeight(Title) + unit(0.5,"line"),
                              pos = 0)
#表にTitleを追加
##gtable::gtable_add_grobコマンドを使用する##
TestTabele <- gtable_add_grob(x = TestTabele, grobs = Title,
                              t = 1, l = 1, r = ncol(TestTabele))

#追加
##ggplot::annotation_customコマンドを使用する##
PointPlot +
  annotation_custom(grob = TestTabele,
                    xmin = 0, xmax = 30,
                    ymin = 80, ymax = 95)
########

出力例

・基本の散布図

・例えば散布図の一部を拡大して追加

・例えば散布図内にBoxPlotを追加

・例えば散布図内に表を追加



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

スポンサードリンク

スポンサードリンク