Skip to content

[Python] 使用 matplotlib-venn 繪製文氏圖

Python 是非常適合用於『數據分析』的程式語言,乾淨簡潔的語法、各式各樣豐富的套件,讓我們幾乎可以使用 Python 完成任何我們想要的功能 —— 而我們只需要把對應的套件找出來!

今天,我想要紀錄的是該如何透過呼叫 Python 的 matplotlib-venn 套件來完成『文氏圖』的繪製。以下就一步步地開始介紹。


文氏圖

文氏圖 (Venn),是一種表示集合的圖示,可以清楚地看見不同集合之間的關係。以下我直接引用 Wikipedia 的解釋:

—— From Wiki

文氏圖(英語:Venn diagram),或譯Venn圖[1]溫氏圖維恩圖維恩圖解范氏圖韋恩圖等,是在集合論(或者類的理論)數學分支中,在不太嚴格的意義下用以表示集合(或)的一種草圖。它們用於展示在不同的事物群組(集合)之間的數學邏輯聯繫,尤其適合用來表示集合(或)類之間的「大致關係」,它也常常被用來幫助推導(或理解推導過程)關於集合運算(或類運算)的一些規律

直觀地來說,假設我們有兩個集合:『集合 A』以及『集合 B』,兩個集合之間是存在著某些相同的元素,那麼,我們就可以將兩個集合繪製成以下這樣圖示:

同樣引用自 Wiki

這就是一個經典的『文氏圖』。


使用 Python 繪製文氏圖

在 Python 中若是想要繪製文氏圖,可以使用 matplotlib-venn 套件,matplotlib-venn 主要是用於實現兩個集合、三個集合之間的文氏圖繪製。

首先,我們要先使用以下指令安裝 matplotlib-venn:

pip3 install matplotlib-venn

安裝結束了之後,我們就開始來繪製一個最簡單的、兩個集合的文氏圖吧!首先,如果我們已經很精確地知道了文氏圖的兩個集合與其交集的數值,那麼,我們可以直接指定該如何繪製圖片的 subset。

# coding: utf-8
from matplotlib_venn import venn2
from matplotlib import pyplot as plt


# Venn2
subset = (2, 2, 1)
venn2(subsets=subset)
plt.show()



Output:

可以看到,這個文氏圖是按照我們設定好的數值來繪製的。設定的 subset 與圖片的對應關係如下:

前兩個數值分別代表 A, B 兩個集合減掉交集的部份、最後一個數值則代表交集的數值。

除了這個方法外,我們也可以直接設定好每個交集的內容,讓程式自動去產生文氏圖 —— 這個方法我覺得比較好,也比較有彈性。

# coding: utf-8
from matplotlib_venn import venn2
from matplotlib import pyplot as plt


# Venn2
set_a = set(['A', 'B', 'C'])
set_b = set(['B', 'C', 'D'])

venn2(subsets=[set_a, set_b])
plt.show()



Output:

這樣的好處在於我們不用主動去設定每個集合的數值以及交集的值,直接設定好兩個集合即可,剩下的程式會自動幫我們計算。

除此之外,我們也可以設定圖形的顏色與名稱的標籤:

# coding: utf-8
from matplotlib_venn import venn2
from matplotlib import pyplot as plt


# Venn2
set_a = set(['A', 'B', 'C'])
set_b = set(['B', 'C', 'D'])

venn2(subsets=[set_a, set_b],
      set_labels=['Set_A', 'Set_B'],
      set_colors=['red', 'blue'])

plt.show()



Output:

就像這樣

以上是 venn2 大致的使用方法。接下來順便紀錄一下 venn3 的使用方法,當然大致上與 venn2 差不了多少。

在直接設定文氏圖的數值上相對複雜一點:

# coding: utf-8
from matplotlib_venn import venn3
from matplotlib import pyplot as plt


# Venn3
venn3(subsets=(1, 2, 3, 4, 5, 6, 7))
plt.show()



Output:

一共輸入 7 個數值,輸入順序如上方文氏圖所示。

而直接設定好各個集合的值並讓程式自動繪製的方法則沒有太大的差別:

# coding: utf-8
from matplotlib_venn import venn3
from matplotlib import pyplot as plt


# Venn3
set_a = set(['A', 'B', 'C'])
set_b = set(['B', 'C', 'D'])
set_c = set(['C', 'D', 'E'])

venn3(subsets=[set_a, set_b, set_c],
      set_labels=['Set_A', 'Set_B', 'Set_C'],
      set_colors=['red', 'blue', 'green'])

plt.show()



Output:


References


Read More

1 thought on “[Python] 使用 matplotlib-venn 繪製文氏圖”

  1. Pingback: Python 與數據資料分析3.1-資料視覺化-基本圖表類型_Johngo学长

Leave a Reply