import matplotlib.pyplot as plt
from matplotlib_venn import venn3_unweighted
# Маппинг: ID области в matplotlib_venn -> (Номер области из картинки, Мощность из таблицы)
regions_info = {
'100': ('5', 6), # Только A
'010': ('3', 5), # Только B
'110': ('7', 8), # A пересечение B (без C)
'001': ('2', 7), # Только C
'101': ('6', 4), # A пересечение C (без B)
'011': ('4', 2), # B пересечение C (без A)
'111': ('8', 2) # Пересечение всех трех (A, B, C)
}
def draw_step(ax, title, highlight_ids):
# Используем venn3_unweighted, передавая единицы, чтобы круги не искажались и были ровными
v = venn3_unweighted(subsets=(1, 1, 1, 1, 1, 1, 1), set_labels=('A', 'B', 'C'), ax=ax)
# Настраиваем цвета и кастомные подписи для каждой области
for region_id, (region_num, power) in regions_info.items():
patch = v.get_patch_by_id(region_id)
label = v.get_label_by_id(region_id)
if patch:
# Делаем все области белыми с черной границей по умолчанию
patch.set_color('white')
patch.set_edgecolor('black')
patch.set_alpha(1.0)
# Если область целевая — красим ее
if region_id in highlight_ids:
patch.set_color('lightblue')
# Меняем текст: выводим номер области в скобках, а под ним — мощность
if label:
label.set_text(f"({region_num})\nм: {power}")
ax.set_title(title)
return v
# Создаем общее полотно
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# Шаг 1: Множество A (области 5, 6, 7, 8)
draw_step(axes[0], 'Шаг 1: Множество A', ['100', '101', '110', '111'])
# Шаг 2: B ∩ A (области 7, 8)
draw_step(axes[1], 'Шаг 2: B ∩ A', ['110', '111'])
# Шаг 3: A \ (B ∩ A) (области 5, 6)
draw_step(axes[2], 'Шаг 3: A \ (B ∩ A)\nИтоговая мощность: 10', ['100', '101'])
plt.tight_layout()
plt.show()