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)) %>%
  #&#22522;&#26412;&#12398;&#25955;&#24067;&#22259;&#12395;&#12503;&#12525;&#12483;&#12488;&#12434;&#36861;&#21152;&#12377;&#12427;&#38936;&#22495;&#12434;&#20316;&#25104;
  #Y_Data >= 60 & X_Data <= 25&#12391;Y_Data&#12395;45:75&#12434;&#12521;&#12531;&#12480;&#12512;&#12391;&#20195;&#20837;
  mutate(Y_Data = if_else(Y_Data >= 60 & X_Data <= 25,
                          sample(c(45:75), size = length(Y_Data),
                                 replace = TRUE),
                          Y_Data))
########

###&#22522;&#26412;&#12398;&#25955;&#24067;&#22259;&#12434;&#20316;&#25104;#####
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()
  
#&#30906;&#35469;
PointPlot
########

###&#20363;&#12360;&#12400;&#25955;&#24067;&#22259;&#12398;&#19968;&#37096;&#12434;&#25313;&#22823;&#12375;&#12390;&#36861;&#21152;#####
#&#25313;&#22823;&#12377;&#12427;&#25955;&#24067;&#22259;&#31684;&#22258;&#12434;&#25351;&#23450;
X_Min <- 20
X_Max <- 30
Y_min <- 60
Y_Max <- 70

#&#12487;&#12540;&#12479;&#12434;&#25277;&#20986;
ExPoint <- TestData %>%
  filter(dplyr::between(X_Data, X_Min, X_Max) &
           dplyr::between(Y_Data, Y_min, Y_Max))

#&#25313;&#22823;&#25955;&#24067;&#22259;&#12434;&#20316;&#25104;
##ggplot::ggplotGrob&#12467;&#12510;&#12531;&#12489;&#20869;&#12395;ggplot&#12467;&#12510;&#12531;&#12489;&#12434;&#35352;&#36848;&#12377;&#12427;##
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())
#&#36861;&#21152;
##&#25313;&#22823;&#31684;&#22258;&#12399;ggplot::annotate&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;##
##&#12464;&#12521;&#12501;&#12399;ggplot::annotation_custom&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;##
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)

###&#20363;&#12360;&#12400;&#25955;&#24067;&#22259;&#20869;&#12395;BoxPlot&#12434;&#36861;&#21152;#####
#Group&#27598;&#12398;Y_Data&#12398;BoxPlot&#12434;&#20316;&#25104;
##ggplot::ggplotGrob&#12467;&#12510;&#12531;&#12489;&#20869;&#12395;ggplot&#12467;&#12510;&#12531;&#12489;&#12434;&#35352;&#36848;&#12377;&#12427;##
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())
#&#36861;&#21152;
##ggplot::annotation_custom&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;##
PointPlot +
  annotation_custom(grob = BoxPlot,
                    xmin = 0, xmax = 30,
                    ymin = 75, ymax = 97)
########

###&#20363;&#12360;&#12400;&#25955;&#24067;&#22259;&#20869;&#12395;&#34920;&#12434;&#36861;&#21152;#####
#Group&#27598;&#12398;X_Data,Y_Data&#12398;&#20013;&#22830;&#20516;&#12398;&#34920;&#12434;&#20316;&#25104;
TestTable <- TestData %>%
  group_by(Group) %>%
  summarise(X_Data = median(X_Data),
            Y_Data = median(Y_Data))

#&#34920;&#12398;&#20316;&#25104;
##gridExtra&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#20351;&#29992;&#12377;&#12427;##
#&#34920;&#12398;&#20307;&#35009;&#12434;&#35373;&#23450;gridExtra::ttheme_default&#12467;&#12510;&#12531;&#12489;
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)))
#&#34920;&#12398;&#20316;&#25104;:gridExtra::tableGrob&#12467;&#12510;&#12531;&#12489;
TestTabele <- tableGrob(TestTable,
                        rows = NULL,
                        theme = Table_T)

#&#34920;Title&#12434;&#36861;&#21152;
##grid::textGrob&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;##
Title <- textGrob("Group_Median", gp = gpar(fontsize = 10))

#&#34920;&#12395;Title&#34892;&#12434;&#36861;&#21152;
##gtable::gtable_add_rows&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;##
TestTabele <- gtable_add_rows(TestTabele,
                              heights = grobHeight(Title) + unit(0.5,"line"),
                              pos = 0)
#&#34920;&#12395;Title&#12434;&#36861;&#21152;
##gtable::gtable_add_grob&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;##
TestTabele <- gtable_add_grob(x = TestTabele, grobs = Title,
                              t = 1, l = 1, r = ncol(TestTabele))

#&#36861;&#21152;
##ggplot::annotation_custom&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;##
PointPlot +
  annotation_custom(grob = TestTabele,
                    xmin = 0, xmax = 30,
                    ymin = 80, ymax = 95)
########

出力例

・基本の散布図

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

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

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



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

タイトルとURLをコピーしました