Rで解析:そうだ、ベン図を作成しよう!!「ggVennDiagram」パッケージ

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

「ggplot2」のシステムを利用してベン図を作成できるパッケージの紹介です。パッケージにはベン図を作成するいくつかのコマンドが収録されていますが、「ggVennDiagram」コマンドを使用するのが一番簡単です。なお、ベン図はデータ数が2から7で作成が可能です。

参考までにtibble classからパッケージに適応するlist classへのデータ作成例を実行コマンド内で紹介します。作成例は「対象のデータ重複を削除して作成」、「対象のデータの重複に連番を付けて作成(例えば、c(A, A, B, C)をc(A_1, A_2, B_1, C_1)とグループごとに作成)」です。

パッケージバージョンは1.2.2。windows11のR version 4.2.2で確認しています。

スポンサーリンク

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

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

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

実行コマンド

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

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

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

###対象のデータ重複を削除して作成#####
#乱数の固定
set.seed(1234)
n <- 200
#&#20316;&#25104;
TestData_1 <- tibble(Group = sample(paste0("Group_", 1:7), n, replace = TRUE),
                   SubGroup = sample(LETTERS[1:20], n,
                                     replace = TRUE)) %>%
  group_by(Group) %>%
  transform(., ID = as.numeric(interaction(SubGroup,
                                           drop = TRUE))) %>%
  tidyr::unite("SubGroup", SubGroup, ID,
               sep = "_", remove = TRUE) %>%
  unstack(SubGroup ~ Group) %>%
  lapply(unique) %>%
  lapply(sort)
########

###&#23550;&#35937;&#12398;&#12487;&#12540;&#12479;&#12398;&#37325;&#35079;&#12395;&#36899;&#30058;&#12434;&#20184;&#12369;&#12390;&#20316;&#25104;#####
#&#20081;&#25968;&#12398;&#22266;&#23450;
set.seed(1234)
n <- 200
#&#20316;&#25104;
TestData_2 <- tibble(Group = sample(paste0("Group_", 1:7), n, replace = TRUE),
                   SubGroup = sample(LETTERS[1:20], n,
                                     replace = TRUE)) %>%
  tidyr::unite("BindDup", Group, SubGroup,
               sep = "_", remove = FALSE) %>%
  group_by(Group, SubGroup) %>%
  mutate(Dup = duplicated(BindDup) | duplicated(BindDup, fromLast = TRUE)) %>%
  #n&#12467;&#12510;&#12531;&#12489;&#12434;&#21033;&#29992;&#12377;&#12427;&#12383;&#12417;&#20808;&#38957;&#12395;dplyr::&#12434;&#20184;&#12369;&#12427;
  dplyr::mutate(NewSubGroup = ifelse(Dup,
                                     paste0(SubGroup, "_", 1:n()),
                                     paste0(SubGroup, "_", 1:n()))) %>%
  unstack(NewSubGroup ~ Group) %>%
  lapply(sort)
#####

#&#12505;&#12531;&#22259;&#12434;&#20316;&#25104;:ggVennDiagram&#12467;&#12510;&#12531;&#12489;
#list class&#12398;&#12487;&#12540;&#12479;&#12434;&#25351;&#23450;:x&#12458;&#12503;&#12471;&#12519;&#12531;
#&#25351;&#27161;&#21517;&#12434;&#25351;&#23450;:category.names&#12458;&#12503;&#12471;&#12519;&#12531;:&#12458;&#12503;&#12471;&#12519;&#12531;&#12467;&#12513;&#12531;&#12488;&#12450;&#12454;&#12488;&#12391;&#12487;&#12540;&#12479;&#21517;
#'plotly' &#12391;&#12452;&#12531;&#12479;&#12521;&#12463;&#12486;&#12451;&#12502;&#12395;&#34920;&#31034;:show_intersect&#12458;&#12503;&#12471;&#12519;&#12531;;TRUE/FALSE
#&#25351;&#27161;&#21517;&#12398;&#33394;&#12434;&#25351;&#23450;:set_color&#12458;&#12503;&#12471;&#12519;&#12531;
#&#25351;&#27161;&#21517;&#12469;&#12452;&#12473;:set_size&#12458;&#12503;&#12471;&#12519;&#12531;
#&#12487;&#12540;&#12479;&#12521;&#12505;&#12523;&#12398;&#34920;&#31034;&#20869;&#23481;:label&#12458;&#12503;&#12471;&#12519;&#12531;;"count","percent","both","none"
#&#12487;&#12540;&#12479;&#12521;&#12505;&#12523;&#12398;&#36879;&#26126;&#24230;:label_alpha&#12458;&#12503;&#12471;&#12519;&#12531;
#&#12487;&#12540;&#12479;&#12521;&#12505;&#12523;&#12398;geom&#12434;&#25351;&#23450;:label_geom&#12458;&#12503;&#12471;&#12519;&#12531;;"label","text"
#&#12487;&#12540;&#12479;&#12521;&#12505;&#12523;&#12398;&#25991;&#23383;&#33394;:label_color&#12458;&#12503;&#12471;&#12519;&#12531;
#&#12487;&#12540;&#12479;&#12521;&#12505;&#12523;&#12398;&#25991;&#23383;&#12469;&#12452;&#12474;:label_size&#12458;&#12503;&#12471;&#12519;&#12531;
#&#12487;&#12540;&#12479;&#12521;&#12505;&#12523;&#12398;%&#23567;&#25968;&#28857;&#26689;&#25968;:label_percent_digit&#12458;&#12503;&#12471;&#12519;&#12531;
#&#12487;&#12540;&#12479;&#12521;&#12505;&#12523;&#12398;&#27178;&#12469;&#12452;&#12474;:label_txtWidth&#12458;&#12503;&#12471;&#12519;&#12531;;show_intersect&#12458;&#12503;&#12471;&#12519;&#12531;&#12364;TRUE&#12398;&#12415;&#36969;&#24540;
#&#21508;&#38936;&#22495;(edges)&#12398;&#26528;&#32218;&#12398;&#31278;&#39006;:edge_lty&#12458;&#12503;&#12471;&#12519;&#12531;;lty&#12391;&#20351;&#29992;&#21487;&#33021;&#12394;&#20869;&#23481;
#&#21508;&#38936;&#22495;(edges)&#12398;&#26528;&#32218;&#12398;&#22826;&#12373;:edge_size&#12458;&#12503;&#12471;&#12519;&#12531;
TestVenn <- ggVennDiagram(x = TestData_2[1:5], 
                          category.names = c("&#12363;&#12425;&#12384;&#12395;&#12356;&#12356;&#12418;&#12398;", "&#12356;&#12356;&#12418;&#12398;",
                                             "KARADA", "GOOD", "2023"),
                          show_intersect = FALSE,
                          set_color = c("red", "black", "blue",
                                             "darkgreen", "#756c6d"),
                          set_size = 4,
                          label = "both", label_alpha = 0.5,
                          label_geom = "text", label_color = "black",
                          label_size = 5, label_percent_digit = 1,
                          label_txtWidth = 40,
                          edge_lty = "dashed", edge_size = 2)

#&#12503;&#12525;&#12483;&#12488;
TestVenn +
  #&#25351;&#27161;&#21517;&#12364;&#38560;&#12428;&#12390;&#34920;&#31034;&#12373;&#12428;&#12394;&#12356;&#22580;&#21512;&#12395;&#23455;&#34892;&#12377;&#12427;
  #scale_x_continuous(expand = expansion(mult = .3)) +
  #&#21508;&#38936;&#22495;&#12398;&#22615;&#33394;&#12434;&#35373;&#23450;:ggplot::scale_fill_distiller&#12467;&#12510;&#12531;&#12489;&#12391;&#25351;&#23450;&#12377;&#12427;&#12398;&#12364;&#27005;&#12391;&#12377;
  scale_fill_distiller(palette = "RdBu")

#&#12505;&#12531;&#22259;&#12434;ggplot2&#12497;&#12483;&#12465;&#12540;&#12472;&#12391;&#20307;&#35009;&#12434;&#25972;&#12360;&#12427;
#ggVennDiagram&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;&#12398;&#12364;&#27005;&#12391;&#12377;
#&#12487;&#12540;&#12479;&#12434;Venn object&#12395;&#22793;&#25563;&#12377;&#12427;:Venn&#12467;&#12510;&#12531;&#12489;
VennObject <- Venn(TestData_2[1:5])
#ggplot2&#12497;&#12483;&#12465;&#12540;&#12472;&#12391;&#25805;&#20316;&#12391;&#12365;&#12427;&#12424;&#12358;&#12395;&#22793;&#25563;&#12377;&#12427;:process_data&#12467;&#12510;&#12531;&#12489;
#&#20316;&#25104;&#12375;&#12383;&#12300;VennGGplot&#12301;&#12434;&#23455;&#34892;&#12377;&#12427;&#12392;&#29702;&#35299;&#12364;&#28145;&#12414;&#12426;&#12414;&#12377;
VennGGplot <- process_data(VennObject)

###&#20307;&#35009;&#12434;&#25972;&#12360;&#12427;#####
#&#31354;&#12398;ggplot object&#12434;&#20316;&#25104;
ggplot() +
  #&#21508;&#38936;&#22495;(edges)&#12434;&#35373;&#23450;:;&#20961;&#20363;&#12399;&#38750;&#34920;&#31034;
  #ggplot2::geom_sf&#12467;&#12510;&#12531;&#12489;&#12398;data&#12395;&#12300;venn_region&#12301;&#12467;&#12510;&#12531;&#12489;&#12391;&#12487;&#12540;&#12479;&#12434;&#25351;&#23450;&#12377;&#12427;
  geom_sf(data = venn_region(VennGGplot), aes(fill = count),
          show.legend = TRUE) +
  #&#21508;&#38936;&#22495;(edges)&#12398;&#26528;&#32218;&#12434;&#35373;&#23450;;&#20961;&#20363;&#12399;&#38750;&#34920;&#31034;
  #ggplot2::geom_sf&#12467;&#12510;&#12531;&#12489;&#12398;data&#12395;&#12300;venn_setedge&#12301;&#12467;&#12510;&#12531;&#12489;&#12391;&#12487;&#12540;&#12479;&#12434;&#25351;&#23450;&#12377;&#12427;
  geom_sf(data = venn_setedge(VennGGplot), aes(color = id), 
          show.legend = FALSE) +
  #&#25351;&#27161;&#21517;&#12434;&#35373;&#23450;;&#20961;&#20363;&#12399;&#38750;&#34920;&#31034;
  #ggplot2::geom_sf_text&#12467;&#12510;&#12531;&#12489;&#12398;data&#12395;&#12300;venn_setlabel&#12301;&#12467;&#12510;&#12531;&#12489;&#12391;&#12487;&#12540;&#12479;&#12434;&#25351;&#23450;&#12377;&#12427;
  geom_sf_text(data = venn_setlabel(VennGGplot),
               aes(label = name),
               show.legend = FALSE) +
  #&#12487;&#12540;&#12479;&#12521;&#12505;&#12523;&#12434;&#35373;&#23450;;&#20961;&#20363;&#12399;&#38750;&#34920;&#31034;
  #ggplot2::geom_sf_label&#12467;&#12510;&#12531;&#12489;&#12398;data&#12395;&#12300;venn_region&#12301;&#12467;&#12510;&#12531;&#12489;&#12391;&#12487;&#12540;&#12479;&#12434;&#25351;&#23450;&#12377;&#12427;
  geom_sf_label(data = venn_region(VennGGplot),
                aes(label = count),
                show.legend = FALSE) +
  #&#21508;&#38936;&#22495;(edges)&#12398;&#22615;&#33394;&#12434;&#35373;&#23450;
  scale_fill_distiller(palette = "RdBu") +
  #&#21508;&#38936;&#22495;(edges)&#12398;&#26528;&#32218;&#12434;&#35373;&#23450;
  scale_color_manual(values = c("Group_1" = "red",
                                "Group_2" = "black",
                                "Group_3" = "blue",
                                "Group_4" = "darkgreen",
                                "Group_5" = "#756c6d")) +
  theme_void()
########

#&#12505;&#12531;&#22259;&#12398;&#12452;&#12513;&#12540;&#12472;&#22259;:plot_shapes&#12467;&#12510;&#12531;&#12489;
plot_shapes()  

#&#12487;&#12540;&#12479;&#25968;2-7&#12398;&#12505;&#12531;&#22259;&#12434;&#20316;&#25104;
#multipanelfigure&#12497;&#12483;&#12465;&#12540;&#12472;&#12364;&#12394;&#12369;&#12428;&#12400;&#12452;&#12531;&#12473;&#12488;&#12540;&#12523;
#https://www.karada-good.net/analyticsr/r-591/
if(!require("multipanelfigure", quietly = TRUE)){
  install.packages("multipanelfigure");require("multipanelfigure")
}

#&#12503;&#12525;&#12483;&#12488;&#12456;&#12522;&#12450;&#12398;&#20316;&#25104;
PlotArea <- multi_panel_figure(width = 150, height = 150,
                               columns = 3, rows = 2)

#&#21306;&#20998;&#12408;&#12503;&#12525;&#12483;&#12488;:fill_panel&#12467;&#12510;&#12531;&#12489;
#&#12503;&#12525;&#12483;&#12488;&#21306;&#20998;&#22793;&#25968;&#12392;fill_panel&#12467;&#12510;&#12531;&#12489;&#12434;%<>%&#12391;&#32331;&#12368;&#12398;&#12364;&#12509;&#12452;&#12531;&#12488;
for(i in 1:6){
  
  PlotArea %<>% fill_panel(
    ggVennDiagram(x = TestData_2[1:(i+1)], 
                  set_color = c("red", "black", "blue",
                                     "darkgreen", "#756c6d",
                                     "red", "black")[1:(i+1)],
                                     set_size = 4,
                  label = "none") +
      #&#21508;&#38936;&#22495;&#12398;&#22615;&#33394;&#12434;&#35373;&#23450;:ggplot::scale_fill_distiller&#12467;&#12510;&#12531;&#12489;&#12391;
      #&#25351;&#23450;&#12377;&#12427;&#12398;&#12364;&#27005;&#12391;&#12377;
      scale_fill_distiller(palette = "RdBu"),
    label = paste0((i+1), "set VennDiagram"),
    label_just = "bottom")
  }
#&#30906;&#35469;
PlotArea

出力例

・ベン図を作成:ggVennDiagramコマンド

例では指標名が隠れています。表示は実行コマンドを確認してください。

・ベン図をggplot2パッケージで体裁を整える

・ベン図のイメージ図:plot_shapesコマンド

・データ数2-7のベン図を作成


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

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