Загрузка данных


import matplotlib.pyplot as plt
from matplotlib_venn import venn3

# Маппинг: 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, но передаем единицы, чтобы круги были ровными
    v = venn3(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()