отображать фактические элементы набора в python, а не количество элементов

#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], "")