Как построить диаграмму Венна в python для двух наборов, когда один набор является подмножеством другого? - PullRequest
1 голос
/ 31 марта 2020

Я использую следующий код для построения диаграмм Венна. Проблема в том, что когда один набор является подмножеством другого, код не работает (см. Рисунок). Как я могу изменить следующий код, чтобы он работал, когда один набор является подмножеством другого? В этом случае я ожидаю, что красный круг будет внутри зеленого круга (тогда цвет, вероятно, должен совпадать с цветом перекрывающейся области вместо красного).

sets = Counter()
sets['01'] = 10
sets['11'] = 5
sets['10']  = 5
setLabels = ['Set 1', 'set 2']

plt.figure()
ax = plt.gca()
v = venn2(subsets = sets, set_labels = setLabels, ax = ax)

h, l = [],[]
for i in sets:
    # remove label by setting them to empty string:
    v.get_label_by_id(i).set_text("")
    # append patch to handles list
    h.append(v.get_patch_by_id(i))
    # append count to labels list
    l.append(sets[i])

#create legend from handles and labels    
ax.legend(handles=h, labels=l, title="Numbers")

plt.title("venn_test")
plt.savefig("test_venn.png")
pdb.set_trace()

enter image description here

1 Ответ

1 голос
/ 31 марта 2020

Вы можете определить sets['10'] = 0, чтобы сделать красную часть (набор 1 без набора 2) пустой. Чтобы этот пустой набор не отображался в легенде, нарежьте маркеры и метки в вызове легенды соответствующим образом: ax.legend(handles=h[0:2], labels=l[0:2], title="Numbers")

Поэтому измените код так:

sets = Counter()
sets['01'] = 10
sets['11'] = 5
sets['10'] = 0  # set 1 without set 2 is empty
setLabels = ['Set 1', 'set 2']

plt.figure()
ax = plt.gca()
v = venn2(subsets = sets, set_labels = setLabels, ax = ax)

h, l = [],[]
for i in sets:
    # remove label by setting them to empty string:
    v.get_label_by_id(i).set_text("")
    # append patch to handles list
    h.append(v.get_patch_by_id(i))
    # append count to labels list
    l.append(sets[i])

#create legend from handles and labels, without the empty part    
ax.legend(handles=h[0:2], labels=l[0:2], title="Numbers")

plt.title("venn_test")
plt.savefig("test_venn.png")
pdb.set_trace()

...