#python #matplotlib
#питон #matplotlib
Вопрос:
Я написал эту небольшую функцию:
def sets():
set1 = random.sample(range(1, 50), 10)
set2 = random.sample(range(1, 50), 10)
return(set1,set2)
sets()
Вывод этой функции выглядит следующим образом:
([24, 29, 43, 42, 45, 28, 26, 3, 8, 21],
[22, 37, 38, 44, 25, 42, 29, 7, 35, 9])
Я хочу изобразить это в виде двусторонней диаграммы Венна. Я знаю, как построить график КОЛИЧЕСТВА перекрытий между наборами, используя matplotlib, т. Е. Используя этот точный код; однако вместо этого я хочу отобразить ФАКТИЧЕСКИЕ ЗНАЧЕНИЯ на графике.
т.е. совпадение между ними должно гласить: 29,42, поскольку это два общих элемента, а не число 2, представляющее количество чисел, которые перекрываются.
Кто-нибудь знает, как это сделать?
Ответ №1:
Возможным решением является вывод меток вместо установленного размера. С помощью пакета matplotlib_venn вы можете сделать что-то вроде этого:
import matplotlib.pyplot as plt
from matplotlib_venn import venn2
import random
set1 = set(random.sample(range(1, 50), 10))
set2 = set(random.sample(range(1, 50), 10))
venn = venn2([set1,set2], ('Group A', 'Group B'))
venn.get_label_by_id('100').set_text('n'.join(map(str,set1-set2)))
venn.get_label_by_id('110').set_text('n'.join(map(str,set1amp;set2)))
venn.get_label_by_id('010').set_text('n'.join(map(str,set2-set1)))
plt.axis('on')
plt.show()
Мы получаем доступ к меткам по двоичному идентификатору, который обозначает наборы.
Ответ №2:
Поведение пакета venn2 по умолчанию заключается в печати размера перекрытия двух наборов. Вот строка исходного кода, в которой эти размеры добавляются к диаграмме Венна: https://github.com/konstantint/matplotlib-venn/blob/master/matplotlib_venn/_venn2.py#L247
Чтобы выполнить эту печать перекрывающихся чисел, вам нужно будет изменить функцию compute_venn2_subsets(a,b) в этом файле. Замените возвращаемый аргумент compute_venn2_subsets(a,b) на:
([val for val in a if val not in b], [val for val in a if val in b], [val for val in b if val not in a])
вместо установленных размеров, которые он возвращает прямо сейчас. Если вы хотите напечатать только перекрывающиеся столбцы, затем верните compute_venn2_subsets(a,b)
("", [val for val in a if val in b], "")