如何用 python 畫出文氏圖?matplotlib-venn 一行解決

by 王翰元

今天來跟大家介紹如何用 python 畫出文氏圖(venn diagram),會使用 matplotlib-venn這個方便的套件。

方便的地方在於我不用再寫一堆 set 之間的運算,雖然不難但就是瑣碎,不開心。matplotlib-venn一次算好數字又能視覺化,讚。

# before
len(set(a) - set(b)) # A 集合減去 B 集合的數量
len(set(b) - set(a)) # B 集合減去 A 集合的數量
len(set(a) & set(b)) # AB 交集的數量

# after 
venn2(subsets=[set(a), set(b)]) # 一次搞定!

套件裡的 function 不多,此篇用的是 venn2venn3。venn2 就是有兩個 set,venn3 就是有三個 set,很直覺。沒有再往上的數量。

我主要使用的場景是計算不同資料源之間的 ID 比對率時會用到。

準備資料

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

a = id_from_channel_A # pd.Series, np.array, ... etc.
b = id_from_channel_B
c = id_from_channel_C

兩個 set (有交集)

可以用 set_labels 來設定要顯示的文字。

plt.figure(figsize=(16,10))  # optional
venn2(subsets=[set(a), set(c)], set_labels=["id from channel_A", "id from channel_B"])

兩個 set (無交集)

當沒有交集的時候,就會自動把集合分開,很方便。

可以用 set_colors 來指定顏色。

plt.figure(figsize=(16,10))  # optional
venn2(subsets=[set(b), set(c)], set_labels=["id from channel_B", "id from channel_C"], set_colors=["green", "blue"])

三個 set

三個集合的範例。

plt.figure(figsize=(16,10))  # optional
venn3(subsets=[set(a), set(b), set(c)], set_labels=["id from channel_A", "id from channel_B", "id from channel_C"])

後記

用到的時候覺得如果有更早有人跟我講就好了。

在查資料的時候發現 plotnine 沒有支援,有點可惜。如果連這個都可以用 plotnine 就好了。

Leave a Comment