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を追加

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

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