Python・matplotlib-vennを用いたベン図(Venn diagrams)の描画

集合と要素や集合に基づいて必要条件・十分条件・必要十分条件などを取り扱う際に用いると良いのがベン図(Venn diagrams)です。当記事ではPythonを用いてベン図を描画するにあたって、matplotlib-vennの用法などの取りまとめを行いました。

・プログラミングまとめ
https://www.hello-statisticians.com/program

matplotlib-vennライブラリ

matplotlib-vennの概要

matplotlib-vennmatplotlibを用いて事象が2もしくは3のベン図の描画を行うにあたっての関数を実装したライブラリです。

matplotlib-vennのインストール

下記を実行することでmatplotlib-vennのインストールを行うことが可能です。

> pip install matplotlib-venn

matplotlib-vennの主な関数

matplotlib-vennの主な関数はvenn2venn2_circlesvenn3venn3_circles4つでそれぞれ下記のような描画を行うことができます。

関数 概要
venn22つの事象に基づくベン図を作成する
venn2_circles2つの事象に基づく色・ラベルのないベン図を作成する
venn33つの事象に基づくベン図を作成する
venn3_circles3つの事象に基づく色・ラベルのないベン図を作成する

ベン図の描画

基本的な実行例

PyPIのドキュメントでは下記のような実行例が紹介されています。

from matplotlib import pyplot as plt
from matplotlib_venn import venn2, venn2_circles, venn3, venn3_circles

figure, axes = plt.subplots(2, 2)
venn2(subsets={'10': 1, '01': 1, '11': 1}, set_labels = ('A', 'B'), ax=axes[0][0])
venn2_circles((1, 2, 3), ax=axes[0][1])
venn3(subsets=(1, 1, 1, 1, 1, 1, 1), set_labels = ('A', 'B', 'C'), ax=axes[1][0])
venn3_circles({'001': 10, '100': 20, '010': 21, '110': 13, '011': 14}, ax=axes[1][1])

plt.show()

・実行結果

上記より、venn2venn2_circlesvenn3venn3_circlesの主な4つの関数の出力結果が確認できます。

以下では、venn2関数について確認します。

from matplotlib import pyplot as plt
from matplotlib_venn import venn2

venn2(subsets = (3, 2, 1))

plt.show()

・実行結果

上図では引数のsubsetsでそれぞれの領域の大きさを指定しましたが、下記のようにset関数を元に集合を引数に与えることも可能です。

from matplotlib import pyplot as plt
from matplotlib_venn import venn2

venn2([set(['A', 'B', 'C', 'D']), set(['D', 'E', 'F'])])

plt.show()

・実行結果

和集合の描画

和集合は下記のように描画を行うことができます。

from matplotlib import pyplot as plt
from matplotlib_venn import venn2

v = venn2(subsets = (1, 1, 1))

v.get_patch_by_id('10').set_color('limegreen')
v.get_patch_by_id('11').set_color('limegreen')
v.get_patch_by_id('01').set_color('limegreen')

v.get_patch_by_id('01').set_alpha(1.0)
v.get_patch_by_id('11').set_alpha(1.0)
v.get_patch_by_id('10').set_alpha(1.0)

v.get_patch_by_id('11').set_edgecolor('white')

v.get_label_by_id('10').set_text('')
v.get_label_by_id('11').set_text('')
v.get_label_by_id('01').set_text('')

plt.title("Union of two sets")
plt.show()

・実行結果

積集合の描画

積集合は下記のように描画を行うことができます。

from matplotlib import pyplot as plt
from matplotlib_venn import venn2

v = venn2(subsets = (1, 1, 1))

v.get_patch_by_id('10').set_color('limegreen')
v.get_patch_by_id('11').set_color('limegreen')
v.get_patch_by_id('01').set_color('limegreen')

v.get_patch_by_id('10').set_alpha(0.1)
v.get_patch_by_id('11').set_alpha(1.0)
v.get_patch_by_id('01').set_alpha(0.1)

v.get_label_by_id('10').set_text('')
v.get_label_by_id('11').set_text('')
v.get_label_by_id('01').set_text('')

plt.show()

・実行結果

参考

https://pypi.org/project/matplotlib-venn/
https://github.com/konstantint/matplotlib-venn