Diagram Venna (zwany także diagramem podstawowym lub diagramem logicznym) to wizualizacja pokazująca wszystkie możliwe relacje logiczne między różnymi zbiorami danych. Diagram Venna można wykorzystać w prawie każdej dziedzinie właśnie do zobrazowania relacji między zbiorami.
Zazwyczaj każdy zbiór reprezentowany jest przez kółko. Rozmiar koła czasami odzwierciedla znaczenie grupy, ale nie zawsze. Grupy zazwyczaj nachodzą na siebie, a rozmiar nakładania się reprezentuje przecięcie między obiema grupami. Można też znaleźć wizualizacje z innymi kształtami takimi jak elipsy czy kwadraty.
Poniżej przykład pokazujący wspólne litery w 3 alfabetach: łacińskim, greckim oraz rosyjskim.
Nazwa diagramu pochodzi od brytyjskiego matematyka i logika John’a Venn’a. Tak naprawdę udoskonalił on jedynie ideę zapoczątkowaną przez szwajcarskiego matematyka Euler’a, który wymyślił sposób na obrazowe przedstawienie zestawów za pomocą punktów na zamkniętej krzywej.
Warto uważać, aby nie przesadzić z liczbą wymiarów. Moim zdaniem wszystko ponad 4 staje się już mocno nieczytelne. Przykład 5 wymiarowego diagramu poniżej:
Czasami jednak zdarzają się bardzo dobre wizualizacje dla większej liczby wymiarów:
Kod w Python
Znalazłem bardzo ciekawą i prostą w użyciu bibliotekę, za pomocą której narysowanie diagramu Venna jest dziecinnie proste.
from matplotlib_venn import venn2, venn2_circles, venn2_unweighted
from matplotlib_venn import venn3, venn3_circles
import matplotlib.pyplot as plt
Teraz przygotujmy dane. Niech naszymi zbiorami będą po prostu… literki.
set1 = ['A','B','C','D','E','F','G','H','I','J','K','L']
set2 = ['B','F','H','M','N','R','T']
set3 = ['B','C','F','G','K','O','Q','P','R','S','T','U','W','X','V','Z']
Metoda 1 – bezpośrednie zbiory
Można po prostu przekazać zbiory, a biblioteka sama przeliczy wszystkie wymagane informacje i dobierze odpowiednio wielkości kółek na wykresie.
venn2([set(set1), set(set2)],set_labels=('set1', 'set2'))
plt.show()
Można troszeczkę zmienić domyślne kolory, aby wykres był bardziej estetyczny.
venn2([set(set1), set(set2)], set_labels=('set1', 'set2'),
set_colors=('crimson', 'darkgrey'), alpha = 0.8)
plt.show()
Możesz prosto dołożyć zarysy kółek:
venn2([set(set1), set(set2)],set_labels=('set1', 'set2'),
set_colors=('crimson', 'darkgrey'), alpha = 0.8)
venn2_circles([set(set1), set(set2)], linestyle='-.',
linewidth=2, color='black')
plt.show()
Metoda 2 – znasz liczby
Jeśli znasz wartości (elementy wspólne i rozłączne) dla zbiorów, to możesz wpisać je bezpośrednio.
venn2(subsets = (9, 4, 3), set_labels=('set1', 'set2'),
set_colors=('crimson', 'darkgrey'), alpha = 0.8)
plt.show()
Metoda 3 – słownik
Można jeszcze przekazać dane za pomocą słownika i odpowiedniej notacji oznaczenia zbiorów.
Jedynka na pierwszym miejscu oznacza przynależność do zbioru A, na drugim miejscu do B a na trzecim do C. Zatem oznaczenie „111” mówi o elementach wspólnych pomiędzy wszystkimi trzema zbiorami.
venn2(subsets = {'10':9, '01': 4, '11': 3},set_labels=('set1', 'set2'),
set_colors=('crimson', 'darkgrey'), alpha = 0.8)
plt.show()
A czy mając trzy zbiory również można tak prosto narysować wykres? Odpowiedź brzmi: TAK!
venn3([set(set1), set(set2), set(set3)], set_labels=('set1', 'set2', 'set3'),
set_colors=('crimson', 'darkgrey', 'orange'), alpha = 0.8)
venn3_circles([set(set1), set(set2), set(set3)], linestyle='-',
linewidth=1, color='black')
plt.show()
A jeśli masz ochotę to możesz pobawić się jeszcze stylami lub opisaniem wykresu.
v3 = venn3([set(set1), set(set2), set(set3)], set_labels=('set1', 'set2', 'set3'),
set_colors=('crimson', 'darkgrey', 'orange'), alpha = 0.8)
venn3_circles([set(set1), set(set2), set(set3)], linestyle='-',
linewidth=1, color='black')
for text in v3.subset_labels:
text.set_fontsize(16)
for text in v3.set_labels:
text.set_color('blue');
plt.title('Venn Diagram for 3 sets', fontweight='bold',fontsize=16)
plt.show()
Mam nadzieję, że kiedyś będziesz miał okazję go wykorzystać!
Pozdrawiam serdecznie z całego serducha,
Nie pdobamisie to