本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

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

「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
#作成
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)
########

###対象のデータの重複に連番を付けて作成#####
#乱数の固定
set.seed(1234)
n <- 200
#作成
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コマンドを利用するため先頭にdplyr::を付ける
  dplyr::mutate(NewSubGroup = ifelse(Dup,
                                     paste0(SubGroup, "_", 1:n()),
                                     paste0(SubGroup, "_", 1:n()))) %>%
  unstack(NewSubGroup ~ Group) %>%
  lapply(sort)
#####

#ベン図を作成:ggVennDiagramコマンド
#list classのデータを指定:xオプション
#指標名を指定:category.namesオプション:オプションコメントアウトでデータ名
#'plotly' でインタラクティブに表示:show_intersectオプション;TRUE/FALSE
#指標名の色を指定:set_colorオプション
#指標名サイス:set_sizeオプション
#データラベルの表示内容:labelオプション;"count","percent","both","none"
#データラベルの透明度:label_alphaオプション
#データラベルのgeomを指定:label_geomオプション;"label","text"
#データラベルの文字色:label_colorオプション
#データラベルの文字サイズ:label_sizeオプション
#データラベルの%小数点桁数:label_percent_digitオプション
#データラベルの横サイズ:label_txtWidthオプション;show_intersectオプションがTRUEのみ適応
#各領域(edges)の枠線の種類:edge_ltyオプション;ltyで使用可能な内容
#各領域(edges)の枠線の太さ:edge_sizeオプション
TestVenn <- ggVennDiagram(x = TestData_2[1:5], 
                          category.names = c("からだにいいもの", "いいもの",
                                             "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)

#プロット
TestVenn +
  #指標名が隠れて表示されない場合に実行する
  #scale_x_continuous(expand = expansion(mult = .3)) +
  #各領域の塗色を設定:ggplot::scale_fill_distillerコマンドで指定するのが楽です
  scale_fill_distiller(palette = "RdBu")

#ベン図をggplot2パッケージで体裁を整える
#ggVennDiagramコマンドを使用するのが楽です
#データをVenn objectに変換する:Vennコマンド
VennObject <- Venn(TestData_2[1:5])
#ggplot2パッケージで操作できるように変換する:process_dataコマンド
#作成した「VennGGplot」を実行すると理解が深まります
VennGGplot <- process_data(VennObject)

###体裁を整える#####
#空のggplot objectを作成
ggplot() +
  #各領域(edges)を設定:;凡例は非表示
  #ggplot2::geom_sfコマンドのdataに「venn_region」コマンドでデータを指定する
  geom_sf(data = venn_region(VennGGplot), aes(fill = count),
          show.legend = TRUE) +
  #各領域(edges)の枠線を設定;凡例は非表示
  #ggplot2::geom_sfコマンドのdataに「venn_setedge」コマンドでデータを指定する
  geom_sf(data = venn_setedge(VennGGplot), aes(color = id), 
          show.legend = FALSE) +
  #指標名を設定;凡例は非表示
  #ggplot2::geom_sf_textコマンドのdataに「venn_setlabel」コマンドでデータを指定する
  geom_sf_text(data = venn_setlabel(VennGGplot),
               aes(label = name),
               show.legend = FALSE) +
  #データラベルを設定;凡例は非表示
  #ggplot2::geom_sf_labelコマンドのdataに「venn_region」コマンドでデータを指定する
  geom_sf_label(data = venn_region(VennGGplot),
                aes(label = count),
                show.legend = FALSE) +
  #各領域(edges)の塗色を設定
  scale_fill_distiller(palette = "RdBu") +
  #各領域(edges)の枠線を設定
  scale_color_manual(values = c("Group_1" = "red",
                                "Group_2" = "black",
                                "Group_3" = "blue",
                                "Group_4" = "darkgreen",
                                "Group_5" = "#756c6d")) +
  theme_void()
########

#ベン図のイメージ図:plot_shapesコマンド
plot_shapes()  

#データ数2-7のベン図を作成
#multipanelfigureパッケージがなければインストール
#https://www.karada-good.net/analyticsr/r-591/
if(!require("multipanelfigure", quietly = TRUE)){
  install.packages("multipanelfigure");require("multipanelfigure")
}

#プロットエリアの作成
PlotArea <- multi_panel_figure(width = 150, height = 150,
                               columns = 3, rows = 2)

#区分へプロット:fill_panelコマンド
#プロット区分変数とfill_panelコマンドを%<>%で繋ぐのがポイント
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") +
      #各領域の塗色を設定:ggplot::scale_fill_distillerコマンドで
      #指定するのが楽です
      scale_fill_distiller(palette = "RdBu"),
    label = paste0((i+1), "set VennDiagram"),
    label_just = "bottom")
  }
#確認
PlotArea

出力例

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

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

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

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

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

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

このコードの続きをAIに聞く

スポンサーリンク
Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.