kuroの覚え書き

96の個人的覚え書き

Pythonでベン図

いろいろな条件で遺伝子発現パターンを調べ、各条件に共通した因子を探るときなど、よくベン図を使う。2条件、3条件などのかんたんなものから、単純な円で表現できなくなる4条件以上など。
これを今まで、excelで並べて処理していたんだけど、超面倒くさい。excelでは図も描いてくれないしね。ということで面倒くさいことはpythonにやらせるに限るね。

条件A: 2, 4, 6, 8, 10, 12
条件B: 3, 6, 9, 12

こういう単純なものだと
Aのみ: 2, 4, 8, 10の4個
Bのみ: 3, 9の2個
AとBの重なり: 6, 12の2個
というかんじに簡単に整理できるのだが、これを勝手にやってもらいたい。

まあPythonで作図なのでmatplotlibかいな、と思って探してみたところmatplotlib-vennというライブラリがつかえるっぽい。

$ python3 -m pip install matplotlib-venn

と。

$ python3
Python 3.9.13 (main, May 24 2022, 21:28:12) 
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from matplotlib_venn import venn2
>>> import matplotlib.pyplot as plt
>>> venn2([set([2, 4, 6, 8, 10, 12]), set([3, 6, 9, 12])], set_labels=('A', 'B'))
>>> plt.title("TEST2")
>>> plt.savefig("test2.png")

これで

こんな感じに描ける。

次に3条件
条件A: 2, 4, 6, 8, 10, 12
条件B: 3, 6, 9, 12
条件C: 6, 13, 14
ではどうなる?
3条件のときはvenn2ではなくてvenn3というのを使うらしい。

>>> plt.close('all')
>>> from matplotlib_venn import venn3
>>> venn3([set([2, 4, 6, 8, 10, 12]), set([3, 6, 9, 12]), set([6, 13, 14])], set_labels=('A', 'B', 'C'))
>>> plt.title("TEST3")
>>> plt.savefig("test3.png")

さて、4条件以上はどうするんだろうか。
あと、それぞれの枠に収まる奴らをリスト化したいんだが、それもどうするのか。

それぞれの要素を書き出すには

>>>A_B_C = set([2, 4, 6, 8, 10, 12]) & set([3, 6, 9, 12]) & set([6, 13, 14])
>>>print(A_B_C)
{12}

でいいわけだな。

pandasと合わせてちょいとアプリ化してみるか。