Rで解析:ggplot2に情報を追加!!「ggpp」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

ggplot2にプロットやテキストなどの情報を追加するのに便利なパッケージの紹介です。多くのコマンドが収録されています。コマンド例ではプロットにテキスト、テーブル、基準線、プロット、centroid、基準で四分割し出現数のコマンドを紹介します。

パッケージバージョンは0.4.4。windows 11のR version 4.1.3で確認しています。

スポンサーリンク

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

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

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

実行コマンド

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

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

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

###データ例の作成#####
set.seed(1234)
n <- 50
TestData <- tibble(Group = factor(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;&#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
########


#&#12503;&#12525;&#12483;&#12488;&#12395;&#12486;&#12461;&#12473;&#12488;&#12434;&#36861;&#21152;:geom_text_npc&#12467;&#12510;&#12531;&#12489;
##&#26222;&#36890;&#12395;geom_text_npc&#12467;&#12510;&#12531;&#12489;
##&#12503;&#12525;&#12483;&#12488;&#20301;&#32622;&#12399;data.frame&#24418;&#24335;&#12391;&#25351;&#23450;&#12375;&#12414;&#12377;##
#X&#36600;&#20301;&#32622;;"left","right","center"
#Y&#36600;&#20301;&#32622;;"bottom","top","middle"
TexiPoint <- tibble(X_Position = c("left", "left", "right", "right", "center"),
                    Y_Position = c("bottom", "top", "bottom", "top", "middle"),
                    text = c("&#12363;&#12425;&#12384;&#12395;", "&#12356;&#12356;&#12418;&#12398;", "KARADA", "GOOD", ".net"))
#&#12503;&#12525;&#12483;&#12488;&#12395;&#35373;&#23450;
PointPlot + geom_text_npc(data = TexiPoint,
                          aes(npcx = X_Position,
                              npcy = Y_Position,
                              label = text),
                          col = c("red", "blue", "yellow", "green", "black"),
                          size = c(3, 5, 7, 9, 11))

##&#20363;&#12360;&#12400;geom_text_npc&#12467;&#12510;&#12531;&#12489;&#12391;facet_wrap&#12434;&#36969;&#24540;
#&#12509;&#12452;&#12531;&#12488;&#12399;facet_wrap&#12398;&#12464;&#12523;&#12540;&#12503;&#22793;&#25968;&#12434;&#22793;&#25968;&#21517;&#12395;&#12377;&#12427;
FacetPoint <- tibble(Group = levels(TestData$Group),
                     X_Position = "left",
                     Y_Position = "top",
                     text = c("&#12363;&#12425;&#12384;&#12395;", "&#12356;&#12356;&#12418;&#12398;", "KARADA", "GOOD"))
#&#12503;&#12525;&#12483;&#12488;&#12395;&#35373;&#23450;
PointPlot + geom_text_npc(data = FacetPoint,
                          aes(npcx = X_Position,
                              npcy = Y_Position,
                              label = text),
                          col = c("red", "blue", "yellow", "green"),
                          size =c(3, 5, 7, 9)) +
  facet_wrap(~Group, scales = "free")
#############


#&#12503;&#12525;&#12483;&#12488;&#12395;&#12486;&#12540;&#12502;&#12523;&#12434;&#36861;&#21152;&#12377;&#12427;:geom_table&#12467;&#12510;&#12531;&#12489;
#&#36861;&#21152;&#12377;&#12427;&#12487;&#12540;&#12479;&#12434;&#28310;&#20633;
InsertTable <- tibble(X = 0, Y = 120) %>%
  mutate(Table = TestData %>%
           group_by(Group) %>%
           summarise(X_Data = mean(X_Data), Y_Data = mean(Y_Data)) %>%
           list())
#&#30906;&#35469;
InsertTable
# A tibble: 1 x 3
#     X     Y Table           
#  <dbl> <dbl> <list>          
#1    0    120 <tibble [4 x 3]>  

#&#12503;&#12525;&#12483;&#12488;&#12395;&#35373;&#23450;
#&#12487;&#12470;&#12452;&#12531;&#12434;&#36969;&#24540;:table.theme&#12458;&#12503;&#12471;&#12519;&#12531;;
#ttheme_gtdefault,ttheme_gtminimal,ttheme_gtbw,ttheme_gtplain
#ttheme_gtdark,ttheme_gtlight,ttheme_gtsimple,ttheme_gtstripes
PointPlot +
  geom_table(data = InsertTable,
             aes(x = X, y = Y, label = Table),
             table.theme = ttheme_gtstripes,
             color = "red", size = 3,
             angle = 0, vjust = 1)
#############


#&#12503;&#12525;&#12483;&#12488;&#12395;&#22522;&#28310;&#32218;&#12434;&#36861;&#21152;:geom_vhlines&#12467;&#12510;&#12531;&#12489;
#x&#36600;:xintercept&#12458;&#12503;&#12471;&#12519;&#12531;
#y&#36600;:yintercept&#12458;&#12503;&#12471;&#12519;&#12531;
PointPlot +
  geom_vhlines(xintercept = 20, yintercept = 80,
               linetype = "dashed", color = "red")
#############


#&#12503;&#12525;&#12483;&#12488;&#12395;&#12503;&#12525;&#12483;&#12488;&#12434;&#36861;&#21152;:geom_plot&#12467;&#12510;&#12531;&#12489;
#&#12503;&#12525;&#12483;&#12488;&#12395;&#35013;&#39166;&#12503;&#12525;&#12483;&#12488;&#12434;&#36861;&#21152;:annotate&#12467;&#12510;&#12531;&#12489;
#&#12503;&#12525;&#12483;&#12488;&#12395;&#36861;&#21152;&#12377;&#12427;&#12503;&#12525;&#12483;&#12488;&#12434;&#28310;&#20633;
#&#25955;&#24067;&#22259;&#12434;&#20316;&#25104;
InsertPlot <- tibble(X = 0, Y = 150) %>%
  mutate(Plot = list(TestData %>%
           filter(dplyr::between(X_Data, 30, 50) &
                    dplyr::between(Y_Data, 65, 85)) %>%
           ggplot(aes(x = X_Data, y = Y_Data, col = Group)) +
           geom_point(show.legend = FALSE, size = 2) +
           scale_color_manual(values = c("red", "#505457",
                                         "#4b61ba", "#a87963")) +
           theme_bw()))
#BoxPlot&#12434;&#20316;&#25104;
InsertBoxPlot <- tibble(X = 50, Y = 150) %>%
  mutate(Plot = list(TestData %>%
                       filter(dplyr::between(X_Data, 30, 50) &
                                dplyr::between(Y_Data, 65, 85)) %>%
                       ggplot(aes(x = X_Data, y = Y_Data,
                                  group = Group, fill = Group)) +
                       geom_boxplot(show.legend = FALSE) +
                       scale_color_manual(values = c("red", "#505457",
                                                     "#4b61ba", "#a87963")) +
                       theme_bw()))

#&#12503;&#12525;&#12483;&#12488;&#12395;&#35373;&#23450;
PointPlot +
  #&#25955;&#24067;&#22259;&#12434;&#36861;&#21152;
  geom_plot(data = InsertPlot, aes(x = X, y = Y, label = Plot)) +
  #BoxPlot&#12434;&#36861;&#21152;
  geom_plot(data = InsertBoxPlot, aes(x = X, y = Y, label = Plot)) +
  #annotate&#12467;&#12510;&#12531;&#12489;&#12391;&#26528;&#12434;&#36861;&#21152;
  annotate(geom = "rect",
           xmin = 30, xmax = 50, ymin = 65, ymax = 85,
           linetype = "dotted", fill = NA, colour = "red",
           size = 1.5)
#############


#&#12503;&#12525;&#12483;&#12488;&#12395;&#12464;&#12523;&#12540;&#12503;&#27598;&#12398;centroid&#12434;&#36861;&#21152;:stat_centroid&#12467;&#12510;&#12531;&#12489;
PointPlot +
  stat_centroid(shape = "cross", size = 4)
#############

#&#22522;&#28310;&#12391;&#22235;&#20998;&#21106;&#12375;&#20986;&#29694;&#25968;&#12434;&#34920;&#31034;:stat_quadrant_counts&#12467;&#12510;&#12531;&#12489;
#&#24179;&#22343;&#12391;&#22522;&#28310;&#12434;&#20316;&#25104;
MeanData <- TestData %>%
  summarise(X_Data = mean(X_Data), Y_Data = mean(Y_Data))

#&#12503;&#12525;&#12483;&#12488;&#12395;&#35373;&#23450;
#x&#36600;:xintercept&#12458;&#12503;&#12471;&#12519;&#12531;
#y&#36600;:yintercept&#12458;&#12503;&#12471;&#12519;&#12531;
PointPlot +
  stat_quadrant_counts(colour = "red",
                       xintercept = MeanData$X_Data,
                       yintercept = MeanData$Y_Data) +
  geom_vhlines(xintercept = MeanData$X_Data,
               yintercept = MeanData$Y_Data,
               linetype = "dashed", color = "red")
#############

#&#23494;&#24230;&#12398;&#20302;&#12356;&#22580;&#25152;&#12363;&#12425;&#25351;&#23450;&#12375;&#12383;&#22522;&#28310;&#12391;&#12495;&#12452;&#12521;&#12452;&#12488;:stat_dens2d_filter&#12467;&#12510;&#12531;&#12489;
#&#35443;&#32048;&#12399;&#12300;?stat_dens2d_filter&#12301;
PointPlot +
  stat_dens2d_filter(keep.fraction = 1/2, #keep.number = 50,
                     colour = "black", size = 4, shape = 1)
########

出力例

・例えばgeom_text_npcコマンドでfacet_wrapを適応

・プロットにテーブルを追加する:geom_tableコマンド

・プロットに基準線を追加:geom_vhlinesコマンド

・プロットにプロットを追加:geom_plotコマンド

・プロットにグループ毎のcentroidを追加:stat_centroidコマンド

・基準で四分割し出現数を表示:stat_quadrant_countsコマンド

・密度の低い場所から指定した基準でハイライト:stat_dens2d_filterコマンド


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

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