集合と要素や集合に基づいて必要条件・十分条件・必要十分条件などを取り扱う際に用いると良いのがベン図(Venn diagrams)です。当記事ではPythonを用いてベン図を描画するにあたって、matplotlib-vennの用法などの取りまとめを行いました。
・プログラミングまとめ
https://www.hello-statisticians.com/program
Contents
matplotlib-vennライブラリ
matplotlib-vennの概要
matplotlib-vennはmatplotlibを用いて事象が2もしくは3のベン図の描画を行うにあたっての関数を実装したライブラリです。
matplotlib-vennのインストール
下記を実行することでmatplotlib-vennのインストールを行うことが可能です。
> pip install matplotlib-vennmatplotlib-vennの主な関数
matplotlib-vennの主な関数はvenn2、venn2_circles、venn3、venn3_circlesの4つでそれぞれ下記のような描画を行うことができます。
| 関数 | 概要 |
venn2 | 2つの事象に基づくベン図を作成する |
venn2_circles | 2つの事象に基づく色・ラベルのないベン図を作成する |
venn3 | 3つの事象に基づくベン図を作成する |
venn3_circles | 3つの事象に基づく色・ラベルのないベン図を作成する |
ベン図の描画
基本的な実行例
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()・実行結果

上記より、venn2、venn2_circles、venn3、venn3_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