Что обозначают знаки эйлера венна
Диаграммы Эйлера-Венна (помните, что это?) и доказательство законов де Моргана для множеств
Подписывайтесь на канал в Яндекс. Дзен или на канал в телеграмм «Математика не для всех», чтобы не пропустить интересующие Вас материалы.
Внимание: важная информация перед прочтением!
Если Вы новичок в теории множеств, ознакомьтесь, пожалуйста, со следующими материалами канала:
Перейдем к делу: в теории множеств у нас осталось совсем немного белых пятен, которые необходимо закрыть. Сегодня поговорим об удобном и наглядном представлении операций над множествами: диаграммами Эйлера-Венна, а также рассмотрим, как через них доказываются два ключевых закона логики — законы де Моргана. Поехали!
Диаграммы Эйлера-Венна
1. Дополнение множества.
2. Объединение множеств.
3. Пересечение множеств.
5. Симметричная разность множеств
На диаграммах Эйлера-Венна могут быть три и более окружностей. Очевидным их преимуществом является наглядность: например, вот так выглядит диаграмма пересечений букв русского, латинского и греческого алфавита.
Законы де Моргана
Несмотря на простоту, законы де Моргана применяются в физике, электротехнике и информатике. С их помощью оптимизируются схемы посредством замены одних логических элементов другими (кстати, вот канал моего товарища — на нём он неторопливо и вдумчиво рассказывает о современных технологиях, начиная с транзисторной логики и заканчивая прикладными приложениями). Эти законы пришли в теорию множеств из математической логики и изначально под А и B понимались не множества, а утверждения.
Суть первого закон де Моргана такова:
То есть: дополнение объединения множеств равно пересечению отдельных дополнений этих множеств (напомню, что когда говорим об операции дополнения множества А, подразумеваем разность UA, где U — универсум (универсальное множество). Докажем первый закон де Моргана с помощью диаграмм Эйлера-Венна.
Закончили с левой частью закона, перейдем к правой:
Таким образом, мы пришли к одинаковым диаграммам двумя разными путями, т.е. доказали справедливость первого закона де Моргана. Второй закон де Моргана выглядит обратным первому:
То есть: дополнение пересечения множеств равно объединению отдельных дополнений этих множеств. Доказательство второго закона идентично первому: оставлю его любопытному читателю.
ПОДПИСЫВАЙТЕСЬ! Этим Вы максимально мотивируете меня на создание интересного и познавательного контента. Ведь, если математика не для всех, то не значит, что она не для Вас конкретно! В теории множеств осталось рассмотреть только функционал отображения множеств, и пойдем дальше к изучению топологии.
Курс «Введение в математическую топологию»
Список материалов для начинающего математика:
Конспект урока по математике «Диаграмма Эйлера-Венна. Знаки и »
Онлайн-конференция
«Современная профориентация педагогов
и родителей, перспективы рынка труда
и особенности личности подростка»
Свидетельство и скидка на обучение каждому участнику
МУНИЦИПАЛЬНОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
«МУЖЕВКАЯ СРЕДНЯЯ ОБЩЕОБРАЗОВАТЕЛЬНАЯ ШКОЛА
ИМЕНИ Н.В. АРХАНГЕЛЬКОГО»
(МБОУ «Мужевская СОШ имени Н.В. Архангельского»)
Тема: «Диаграмма Эйлера-Венна. Знаки и
»
Учитель начальных классов:
Улитина Елена Владимировна
Тема : «Диаграмма Эйлера-Венна. Знаки и
»
Вид: урок усвоения новых знаний
Форма урока: урок-путешествие
Цель: формирование у учащихся умение использовать знаки и
для обозначения принадлежности элемента множества.
— познакомить учащихся с диаграммой Эйлера-Венна;
— способствовать развитию приёмов умственной деятельности: сравнение, анализ, обобщение;
— воспитывать толерантное отношение друг к другу, навыки взаимного сотрудничества.
Планируемые образовательные результаты
— развитие учебно-познавательного интереса; способность к самооценке; строить логическое рассуждение, включающее установление причинно-следственных связей.
— умение осуществлять логические операции; ориентироваться в своей системе знаний, строить небольшие математические высказывания.
— умение оформлять свои мысли в устной форме; слушать и понимать речь других; учиться работать в паре, формулировать собственное мнение и позицию.
— умение планировать своё действие в соответствии с поставленной задачей; оценивать правильность выполнения действия на уровне адекватной оценки; вносить необходимые коррективы в действие после его завершения на основе его оценки и учёта характера сделанных ошибок.
-знать и использование диаграммы Эйлера-Венна для графического изображения множеств.
Рабочая программа по математике, составленная на основе ФГСО НОО, Примерной программы по предмету «Математика», Планируемых результатов начального общего образования, программы формирования УУД, авторской программы по математике Л.Г.Петерсон (УМК «Перспектива»);
Л.Г.Петерсон Математика: учебник для 3 класса. В 3-х ч. Ч.1- Смоленск: «Ассоциация XXI век», 2014;
Уроки математики: Методические рекомендации к учебнику 3 класса: Пособие для учителя / Л.Г.Петерсон.- Смоленск: «Ассоциация XXI век», 2014
Образовательные ресурсы: интерактивная доска; информационное обеспечение урока (презентация; учебник «Диаграмма Эйлера-Венна» и рабочая тетрадь к учебнику (автор Л.Г.Петерсон); карточки; оборудование урока: (компьютер, презентация, учебник Л.Г.Петерсон «Математика», рабочая тетрадь).
Характеристика педагогического инструментария:
— педагогические методы : беседа, инструктаж;
— исследовательские методы: анализ, синтез, сравнение, выдвижение гипотез, обобщение, уточнение;
— работа с информацией : восприятие, анализ и оценка содержания визуальной и слуховой информации;
Форма организации познавательной деятельности: групповая, фронтальная.
— Сегодня у нас будет необычный урок, мы с вами отправляемся в путешествие, я сейчас прочитаю вам стихотворение, а если вы послушаете его очень внимательно, то сможете с легкостью отгадать, на чем мы сегодня поедем, поплывем или полетим.
Решать, отгадывать, смекать!
Плывите все к знаниям,
Не сбиваясь со счёту. (на корабле)
— Все, верно, сегодня мы отправляемся на корабле к острову «Сокровищ и знаний».
На доске появляется корабль, звучит музыка «Шума прибоя»
Актуализация знаний учащихся и фиксация затруднений в деятельности
— Путешествие будет не близким, в пути нас ожидают всевозможные препятствия и различные открытия. Уверяю вас, что путешествие будет увлекательным и опасным, но справиться с этими опасностями помогут знания и умения, которые вы приобрели не только на уроках математики, но и на других наших уроках, а некоторые знания вы приобретёте сегодня.
— Во время нашего путешествия мы будем делать записи в наши бортовые журналы (рабочие тетради).
— Пора отправляться в путь. Но, ребята, мы не можем попасть на корабль, нам нужно самим соорудить трап к нашему кораблю.
Слайд 1, даны изображения множеств
— Посмотрите внимательно на доску, что вы видите? Под буквой А. В. С? (множество материала; множество инструментов; множество людей на корабле)
-Что объединяет все эти множества? (они относятся к нашему путешествию, кораблю)
— Это равные или неравные множества? (неравные)
— Приведите примеры равных множеств? (Таня взяла с собой в путешествие питомцев: собаку, попугая и кошку, а Лена взяла с собой: кошку, собаку и попугая)
— Ответьте на вопрос: сколько элементов множеств попугаев находится у нас в классе? (пустое множество, так как в классе нет ни одного попугая)
— Молодцы, мы смогли соорудить трап и подняться на корабль.
-Но вот, ни задача, наш корабль никак не может сдвинуться с места, прежде чем отправиться в путешествие, нужно поднять якорь. Откройте бортовые журналы, запишите число 9 сентября и ответьте мне на вопрос: над какой темой мы продолжаем работать? (Множество). Запишите.
— Прочитайте записи с доски:
Читают правильно записи
а) Ø (знак- пустое множество)
б) С = < о; к; е; а; н > (множество элементов в слове океан)
в) А = В, К ≠ С (множество А равно множеству В; множество К не равно множеству С)
— Чтение, какой карточки вызвало у вас затруднение? (запись на карточке г)
-Что вам показалось незнакомым? (знаки обозначения)
-Хотите узнать, что они обозначают? (да). Наш якорь поднят, и мы отправляемся вперед, за новыми открытиями!
Показываю карту путешествия
— А вот и наша карта путешествия. Сегодня мы узнаем, можно ли графически изобразить множества, и для чего используют символы, которые вы не смогли прочить. Поможет нам в этом наш незаменимый учебник. Но снова беда, наш штурман сбился с пути. Чтобы взять правильный курс, мы должны проплыть Залив «Краткость записи». Открываем с.14 №1. Давайте прочитаем задание и попробуем ответить на вопросы.
Назовите каждый элемент множества В = < 2, m , ■ > . Принадлежит ли этому множеству число 2, буква а? (да, нет).
-Давайте обратим внимание на доску и посмотрим, как бы у нас выглядела запись, если бы мы занесли ее в тетрадь.
Число 2 принадлежит множеству В
Буква а не принадлежит множеству В
-Удобно использовать такую длинную запись на математике? (нет)
— Что бы вы предложили для более короткой и удобной записи? (нужно использовать какой-либо значок-символ)
— В математике общепринято использовать знаки, которые обозначают:
-Смотрим на экран, как бы выглядела наша запись при помощи наших новых знаков.
-А если я попрошу вас изобразить при помощи рисунка это самое множество В, кто из вас сумеет это сделать? (дети предполагают, но не верно)
— Тогда не будем гадать, а поможем быстрее плыть нашему кораблю Знаний. Встаем со своих мест и повторяем за мной движения.
Над волнами чайки кружат,
Полетим за ними дружно.
Брызги пены, шум прибоя,
А над морем – мы с тобою!
(Дети машут руками, словно крыльями, имитируя чаек)
Мы теперь плывём по морю
И резвимся на просторе.
И дельфинов догоняй
(Плавательные движения руками)
-Мы подошли к Бухте Правил. Давайте еще раз прочитаем об этом, открыв учебник на с. 14. Читают правило
-Что такое диаграмма Эйлера- Венна? (рисунок)
— А теперь давайте посмотрим, сможем ли мы применить свои знания на практике? Выполним задания №2 и 3 на с. 14. Дети по цепочке читают задания, комментируя вслух. Я записываю их на доске.
№ 2. На рисунок изображена диаграмма множества А. Какие элементы принадлежат этому множеству А, а какие ему не принадлежат? Сделай записи в тетради, используя знаки ∈ , ∉.
№ 3. Нарисуй диаграмму множества С и отметь на ней элементы d , 10, 5, звезда, треугольник, квадрат, если известно, что: стоят знаки ∈ или ∉ у каждого элемента.
— Сейчас самое интересное в нашем путешествии, мы совершим экскурсию в подводный мир. Наденем акваланги и отправимся в путь. Погружаемся в воду. Самостоятельно выполним задание №4 на с.14. 1 ученик у доски
— Давайте сверим с доской и со своими тетрадями, так ли у вас получилось?
— И мы снова возвращаемся на берег. Поднимаемся на корабль, снимаем акваланги и отправляемся в путь, но что мы видим… Наш корабль атаковали обезьяны.
-Им необходима наша помощь. Прочитаем задачу.
Мама обезьянок принесла своим детям 45 кг бананов и 85 кг яблок. Из них в первый день обезьянки съели 18 кг фруктов, а во второй день – в 2 раза больше, чем в первый. Сколько фруктов у обезьян еще осталось?
-Прочитайте вопрос задачи. Сможем ли мы сразу дать ответ на него? (нет) Что нам поможет в решении задачи? (схема)
1)18*2= 36 (кг)- во второй день.
2) 45+85=130 (кг)- всего фруктов.
4)112-36= 76 (кг)- осталось.
Ответ: 76 килограммов
-Посмотрите, по борту плывет бутылка.
-В таких запечатанных бутылках хранилась информация или просьба о помощи. Распечатываем бутылку, а в ней письмо.
Распечатываем бутылку, в ней домашнее задание
— Чтобы вам заполнилось наше путешествие выполните дома Т.с 13 №1-3, правило с.14.
— Что такое диаграмма Эйлера-Венна?
-Наше путешествие подошло к концу. Мы прибыли с вами на остров. Можно забирать сокровища. Как вы думаете, что находится в сундуке?
-Как вы думаете, а какое главное сокровище мы приобрели сегодня на уроке?
— Мы закончили свое путешествие. Оцените свою работу на уроке. Оценки за работу на уроке получают:…
Как построить диаграмму Венна с 50 кругами? Визуализация множеств и история моего Python-проекта с открытым кодом
Всем привет, меня зовут Фёдор Индукаев, я работаю аналитиком в Яндекс.Маршрутизации. Сегодня хочу рассказать вам про задачу визуализации пересекающихся множеств и про пакет для Python с открытым кодом, созданный мной для её решения. В процессе мы узнаем, чем различаются диаграммы Венна и Эйлера, познакомимся с сервисом распределения заказов и по касательной заденем такую область науки, как биоинформатика. Двигаться будем от простого к более сложному. Поехали!
О чём речь и зачем это нужно?
Почти каждому, кто занимался разведочным анализом данных, хотя бы раз приходилось искать ответ на вопросы такого типа:
Все перечисленные вопросы можно свести к одной и той же формулировке. Она звучит так: даны несколько конечных множеств, возможно, пересекающихся между собой, и надо оценить их взаимное расположение — то есть понять, как именно они пересекаются.
Речь пойдёт о визуализациях и программных инструментах, помогающих решать эту задачу.
Диаграммы Венна
Такие рисунки с двумя или тремя кругами, думаю, знакомы каждому и не требуют объяснения:
Особенность диаграммы Венна в том, что она статична. Фигуры на ней равновелики и расположены симметрично. На рисунке изображаются все возможные пересечения, даже если большинство из них на самом деле пусты. Такие диаграммы подходят, чтобы проиллюстрировать абстрактные понятия или множества, точные размеры которых неизвестны либо неважны. Основная информация тут содержится не в графике, а в подписях.
Именно такими их замыслил Джон Венн, английский математик и философ. В своей статье 1880 года он предложил диаграммы для графического отображения логических высказываний. К примеру, высказывание «любой Х — это Y либо Z» даёт диаграмму справа (иллюстрация взята из оригинальной статьи). Чёрным закрашена область, не удовлетворяющая высказыванию: те Х, которые не являются ни Y, ни Z. Основной посыл статьи именно в том, что статические рисунки без варьирования формы и расположения фигур лучше подходят для целей логики, чем динамические диаграммы Эйлера, о которых речь пойдёт ниже.
Ясно, что в анализе данных сфера применения диаграмм Венна ограничена. Они дают только качественную информацию, но не количественную и не отражают ни размер, ни даже пустоту пересечений. Если вас это не останавливает, в вашем распоряжении пакет venn, который строит такие диаграммы для множеств. Для каждого
там есть одна-две типовые картинки, и различаться будут только подписи:
Если же мы хотим что-то более динамически зависящее от данных, стоит обратить внимание на другой подход: диаграммы Эйлера.
Диаграммы Эйлера
В отличие от диаграмм Венна, форма и положение фигур на плоскости здесь подобраны так, чтобы показать взаимоотношения множеств или понятий. Если какое-то пересечение пусто, то фигуры тоже по возможности не перекрывают друг друга, как на рисунке о растениях и животных.
Обратите внимание, что рисунок про вопрос на лекции отличается от остальных двух. На нём важно не только положение фигур, но и размеры пересечений — в них и заключен весь юмор.
Эту идею можно использовать и для нашей задачи. Возьмём два-три множества и нарисуем круги с площадями, пропорциональными размерам этих множеств. А затем постараемся расположить круги на плоскости таким образом, чтобы площади перекрытия также были пропорциональны размерам пересечений.
Именно это делает (несмотря на своё название) пакет matplotlib-venn:
Изобразить два множества с точным соблюдением всех пропорций легко. Но уже на трёх метод может давать сбой. Пусть, например, одно из трёх множеств — в точности пересечение остальных двух:
Рисунок выглядит неважно, появилась странная область с цифрой 0. Но удивляться тут нечему, ведь пересечение двух кругов изобразить в виде круга никак не получится.
А вот ещё более удручающий пример: два множества и их симметрическая разность (объединение минус пересечение):
Получилось что-то совсем странное: обратите внимание, сколько тут нулей!
Первый пример ещё можно спасти, если взять вместо кругов прямоугольники (пересечение прямоугольников — тоже прямоугольник), а для второго нужны как минимум невыпуклые фигуры. Ну а больше трёх множеств данный пакет не поддерживает в принципе.
Других общедоступных инструментов для Python, развивающих подход Эйлера — Венна, я не знаю, и дальше пойдёт уже история моих собственных экспериментов. Но прежде чем продолжить, сделаю небольшое отступление, чтобы объяснить, зачем я вообще взялся за задачу визуализации множеств.
Пару слов об API построения оптимальных маршрутов
Как я говорил, наш отдел делает Яндекс.Маршрутизацию. Один из наших сервисов помогает интернет-магазинам, службам доставки и любым компаниям, чей бизнес включает логистику, строить оптимальные маршруты для транспорта.
Клиенты взаимодействуют с сервисом, отправляя запросы к API. Каждый запрос содержит список заказов (точек доставки) с координатами, интервалами доставки и т.д., а также список машин, которыми нужно развезти заказы. Наш алгоритм переваривает все эти данные и выдаёт оптимальные маршруты с учётом пробок, вместимости машин и много чего ещё.
У нас сотни, а не миллионы клиентов, как у популярных B2C-сервисов Яндекса. Поэтому нам особенно важно счастье каждого клиента, к тому же есть возможность уделять ему больше внимания и глубже погружаться в его задачи. Для этого, в частности, полезно иметь инструменты, помогающие понять, какие запросы нам присылает клиент.
Приведу пример. Допустим, за один день от компании «Ромашка» пришло 24 запроса. Это может означать, что:
Упрощаем задачу: от кругов к полосам
Какое-то время я пользовался пакетом matplotlib-venn, но ограничение в «два с половиной» множества, конечно, расстраивало. Размышляя над разными подходами к задаче, я решил попробовать перейти от кругов и вообще двумерных примитивов к одномерным — горизонтальным полосам. Пересечения тогда можно изображать наложением по вертикали вот таким образом:
Линейные размеры воспринимаются глазом лучше, чем площади, для построения не нужна сложная тригонометрия, а разнесение множеств по оси Y делает график менее перегруженным. К тому же наш первый неудачный пример (два множества и их пересечение в качестве третьего) улучшается сам собой:
Проблема с симметрической разностью пока ещё никуда не делась. Но мы поступим с ней, как Александр Македонский с гордиевым узлом: разрешим, если надо, разрубать одно из множеств на две части:
Красное множество изображено двумя полосами вместо одной, но ничего страшного в этом нет. Обе находятся на одной и той же высоте и имеют один цвет, так что их единство визуально хорошо считывается.
Нетрудно убедиться, что таким способом можно с точным соблюдением пропорций изобразить любые три множества. Тем самым задачу для равного 2 или 3 можно считать решённой.
Ещё один плюс такого подхода в том, что его легко применить к любому числу множеств, что мы и сделаем совсем скоро. Всё, что для этого нужно, — разрешить не один, а произвольное число разрывов в строках. Но сперва — немного простой комбинаторики.
Немного арифметики
Посмотрим на диаграмму Венна с тремя кругами и посчитаем, на сколько областей круги разбивают друг друга:
Каждая область определяется тем, лежит она внутри или снаружи каждого из трёх кругов, ну а внешняя область — лишняя. Итого получаем . Другие расположения трёх кругов могут давать меньшее количество областей вплоть до 1, когда все круги совпадают.
Перенося это рассуждение с кругов на множества, получим, что любые множеств разбивают друг друга не более чем на
таких элементарных частей. Важно, что каждая из этих частей либо целиком входит, либо целиком не входит в любое из данных множеств. В наших новых диаграммах столбцы — это и есть такие элементарные части.
Больше множеств!
Итак, мы хотим обобщить вот такие схемы на случай 3$» data-tex=»inline»/>:
Для множеств у нас получается сетка с
строками и
столбцами, как мы только что подсчитали. Остаётся пройтись по каждой строке и закрасить ячейки, соответствующие входящим в данное множество элементарным частям.
Для иллюстрации возьмём модельный пример с пятью множествами:
Действуя, как описано выше, получаем вот такой рисунок:
Читается он плохо: в строках слишком много разрывов, все множества порублены в капусту. Но раз нам не нравятся разрывы, то почему бы прямо не поставить задачу — минимизировать их? Ведь порядок столбцов несущественен, ничто не мешает нам переставлять их, как захочется. Приходим к такой задаче: найти перестановку столбцов данной матрицы из нулей и единиц с минимальным числом разрывов между единицами в строках.
Как мне подсказали уже позже, это практически задача коммивояжера в метрике Хэмминга, она NP-полная. Если столбцов получилось немного (скажем, не более 12), то найти нужную перестановку можно полным перебором, а иначе надо прибегать к тем или иным эвристикам.
Применим несложный жадный алгоритм. Назовём похожестью двух столбцов число позиций, на которых значения в этих столбцах совпадают. Возьмём два самых похожих столбца, поставим их вместе. Далее будем жадно наращивать последовательность в обе стороны от этой пары. Среди оставшихся столбцов найдём тот, который наиболее похож на один из этих двух, приставим — и так далее с остальными столбцами.
Вот рисунки до и после применения алгоритма:
Стало гораздо лучше. Именно на этой стадии я почувствовал, что выходит что-то полезное. Поэкспериментировав, я заметил, что алгоритм склонен залипать в локальных минимумах. Это удалось неплохо полечить с помощью простой рандомизации: немного зашумляем значения похожести столбцов, прогоняем алгоритм, повторяем 1000 раз, выбираем лучшее из 1000 решений.
Получился уже вполне рабочий инструмент, но в него можно добавить ещё немного полезной информации. Я сделал два дополнительных графика: на правом выведены размеры исходных множеств, а верхний для каждого пересечения показывает, во сколько из наших множеств оно входит. По сути, это ни что иное, как суммы нашей бинарной матрицы по строкам (справа) и по столбцам (вверху):
Ещё я добавил опцию упорядочивания самих множеств (т. е. строк) по тому же принципу, что и столбцов: с минимизацией числа разрывов. В итоге похожие множества группируются:
Применение в работе
Естественно, первым делом я стал применять новый инструмент для той задачи, для которой его и создавал: исследовать запросы клиентов к нашему API. Результаты меня порадовали. Вот так, например, выглядел рабочий день одного из клиентов. Каждая строка — запрос к API (множество ID входящих в него заказов), а подписи в середине — время отправки запросов:
Весь день как на ладони. В 10:49 логист клиента с интервалом 23 секунды послал два одинаковых запроса со 129 заказами. С 11:25 до 15:53 было три запроса с другим набором из 152 заказов. В 16:43 пришёл третий уникальный запрос со 114 заказами. К решению этого запроса логист затем применил четыре ручные правки (это можно делать через наш UI).
А так выглядит идеальный день: все независимые задачи решены по одному разу, никаких правок или подбора параметров не потребовалось:
А вот пример от клиента, отправляющего запросы каждые 15–30 минут, чтобы учесть заказы, поступающие в реальном времени:
Даже на 50 множествах алгоритм хорошо выявил структуру, скрытую в данных. Видно, как старые заказы по мере исполнения убирались из запросов и замещались новыми.
Словом, закрыть созданным инструментом свою рабочую потребность мне вполне удалось.
Banana for scale (not really)
Пока я изучал существующие подходы, мне несколько раз попадался на глаза рисунок из журнала Nature, где сравниваются геномы банана и пяти других растений:
Обратите внимание, как соотносятся размеры областей с 13 и 149 элементами (указаны стрелками): вторая в несколько раз меньше. Так что ни о какой пропорциональности тут нет и речи.
Мне, конечно, захотелось попробовать силы и на таких данных, но результат меня не порадовал:
График выглядит неряшливо. Причина в том, что, во-первых, почти все пересечения (62 из 63 возможных) непусты, а во-вторых, их размеры различаются на три порядка. В результате числовым аннотациям становится очень тесно.
Чтобы мой инструмент был удобен и для таких данных, я добавил несколько параметров. Один позволяет частично выровнять ширины столбцов, другой прячет аннотации, если ширина столбца меньше заданной величины.
Такой вариант читается уже вполне неплохо, но ради этого пришлось пожертвовать точной пропорциональностью размеров.
Как оказалось, обратив внимание на сферу биоинформатики, я не прогадал. Я отправил пост о своём инструменте на Reddit в r/visualization, r/datascience и r/bioinformatics, именно в последнем его приняли лучше всего, отзывы были прямо-таки восторженные.
Превращение в продукт
В итоге я понял, что получился неплохой инструмент, который может быть полезен многим. Поэтому родилась идея превратить его в полноценный пакет с открытым исходным кодом. Конечно, нужно было согласие руководителей, но ребята не только не возражали, но и поддержали меня, за что им большое спасибо.
Работая в основном по выходным, я начал понемногу приводить код в товарный вид, писать тесты и разбираться с системой пакетов в Python. Это мой первый проект такого рода, поэтому всё заняло несколько месяцев.
Придумать хорошее название тоже оказалось непростой задачей, и справился я с ней плоховато. Выбранное имя (supervenn) нельзя назвать удачным, ведь вся соль диаграмм Венна в их статичности, я же, напротив, стремился точно показывать реальные размеры. Но когда я это осознал, проект уже вышел в свет и менять название было поздно.
Аналоги
Конечно, я не первый использовал этот подход к визуализации множеств: идея, в общем-то, лежит на поверхности. В открытом доступе есть два похожих веб-приложения: RainBio и Linear Diagram Generator, второе использует в точности тот же принцип, что и у меня. (Авторы вдобавок написали статью на 40 страниц, где экспериментально сравнили, что лучше воспринимается — горизонтальные или вертикальные линии, тонкие или толстые и т. п. Мне даже показалось, что для них первичной была именно статья, а сам инструмент — лишь дополнение к ней.)
Чтобы сравнить эти два приложения с моим пакетом, снова используем пример со словами. Можете сами решить, какой вариант более удобочитаем и информативен.
RainBio
Linear Diagram Generator
supervenn
Другие подходы
Нельзя не упомянуть проект UpSet, существующий в виде веб-приложения и пакетов для R и Python. Базовый принцип можно понять, посмотрев на отображение данных о геноме банана. График обрезан справа, показаны только 30 пересечений из 62:
Интересно, что если использовать supervenn с сортировкой столбцов по ширине и сделать столбцы одинаковыми с помощью параметра выравнивания ширин, то получится почти то же самое, хотя это и не сразу заметно. Не хватает лишь вертикальных линий с размерами пересечений, вместо них только цифры внизу графика:
Уже при написании этого текста я попробовал воспользоваться Python-версией UpSet, но обнаружил, что пакет не обновлялся с 2016 года, в документации никак не описан формат входных данных, а тестовый пример падает с ошибкой. Веб-версия исправна, в ней много полезных вспомогательных функций, но работать с ней довольно тяжело из-за сложного способа ввода данных.
Наконец, в сети доступен интересный обзор методов визуализации множеств. Далеко не все из них реализованы в виде программных инструментов. Вот несколько картинок для привлечения внимания:
Особенно меня заинтересовал метод Bubble Sets (нижний ряд), позволяющий изображать небольшие множества поверх заданного расположения элементов на плоскости. Это может быть удобно, например, когда элементы привязаны к оси времени (а) или к карте (b). Пока что этот метод реализован только на Java и JavaScript (ссылки есть на странице авторов), и было бы здорово, если бы кто-нибудь взялся портировать его на Python.
Я отправил письма с кратким описанием проекта авторам UpSet и обзора и получил хорошие отзывы. Двое из них даже обещали включить supervenn в свои лекции по визуализации множеств.
Заключение
Если вы захотите воспользоваться пакетом, он доступен на GitHub и в PyPI: pip install supervenn. Я буду благодарен за любые замечания о коде и использовании пакета, за идеи и критику. Особенно буду рад прочитать рекомендации, как улучшить алгоритм перестановки столбцов для больших , и советы, как писать тесты для функций построения графиков.
Спасибо за внимание!
Ссылки
2. J.-B. Lamy and R. Tsopra. RainBio: Proportional visualization of large sets in biology. IEEE Transactions on Visualization and Computer Graphics, doi: 10.1109/TVCG.2019.2921544.
3. Peter Rodgers, Gem Stapleton and Peter Chapman. Visualizing Sets with Linear Diagrams. ACM Transactions on Computer Human Interaction 22(6) pp. 27:1-27:39 September 2015. doi:10.1145/2810012.
6. Christopher Collins, Gerald Penn and Sheelagh Carpendale. Bubble Sets: Revealing Set Relations with Isocontours over Existing Visualizations. IEEE Trans. on Visualization and Computer Graphics (Proc. of the IEEE Conf. on Information Visualization), vol. 15, iss. 6, pp. 1009−1016, 2009.