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を追加
・例えば散布図内に表を追加
少しでも、あなたの解析が楽になりますように!!