今天來跟大家介紹如何用 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 不多,此篇用的是 venn2
和 venn3
。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 就好了。