Сюжетная диаграмма Венна с пандами и матплотлиб_венн
Я хотел бы построить диаграммы Венна на основе моего фрейма данных панд. Я это понимаю matplotlib_venn
принимает наборы в качестве входных данных. Мой набор данных содержит идентификатор клиента и два других столбца с информацией о том, был ли клиент в кампании или нет.
df_dataset = pd.read_csv('...path...',delimiter=',',decimal=',')
campaign_a = df_dataset[(df_dataset['CAM_A'] == 1)]
campaign_b = df_dataset[(df_dataset['CAM_B'] == 1)]
plt.figure(figsize=(4,4))
set1 = set(campaign_a['CLI_ID'])
set2 = set(campaign_b['CLI_ID'])
venn3([set1, set2], ('Set1', 'Set2'))
plt.show()
Однако я получаю ошибку:
Файл "C:\Python27\Lib\site-packages\matplotlib_venn_venn3.py", строка 44, в областях compute_venn3_areas = np.array(np.abs(figure_areas), float)
Ошибка типа: неверный тип операнда для abs(): 'set'
ОБНОВИТЬ
Основываясь на совете LanS, он работает сейчас. Но по некоторым причинам диаграммы не вместе. Но в их документации тот же код работает.
plt.figure(figsize=(4,4))
set1 = set(campaign_a['CLI_ID'])
set2 = set(campaign_b['CLI_ID'])
set3 = set(union['CLI_ID'])
venn3([set1, set2, set3], ('A', 'B', 'union'))
plt.show()
ОБНОВЛЕНИЕ 2 - решение
В конце концов, простейший подход - это только вставить размер каждого пробела, а не набор данных. Вдохновение здесь.
2 ответа
Я считаю, что вам нужно пройти 3 сета. Исходя из приведенного здесь кода, если вы передадите три подмножества, они будут преобразованы в кортеж перед передачей в compute_venn3_areas
, где np.abs
могу справиться с ними. Случай, когда вы передаете только 2 сета, выглядит как необработанная ошибка.
Эта ошибка является результатом попытки заставить 2 набора в venn3. Вам нужно импортировать venn2 из той же библиотеки.
from matplotlib_venn import venn2
df_dataset = pd.read_csv('...path...',delimiter=',',decimal=',')
campaign_a = df_dataset[(df_dataset['CAM_A'] == 1)]
campaign_b = df_dataset[(df_dataset['CAM_B'] == 1)]
plt.figure(figsize=(4,4))
set1 = set(campaign_a['CLI_ID'])
set2 = set(campaign_b['CLI_ID'])
venn2([set1, set2], ('Set1', 'Set2'))
plt.show()
Простой способ создания диаграмм Венна для небольшого количества наборов. Надеюсь это поможет.
import matplotlib.pyplot as plt
from matplotlib_venn import venn2
from matplotlib_venn import venn3
set1 = set()
set2 = set()
set3 = set()
set4 = set()
set_array = []
set_names = ['Set1', 'Set2', 'Set3', 'Set4']
set1.add('a')
set1.add('b')
set2.add('b')
set2.add('c')
set3.add('c')
set3.add('d')
set4.add('d')
set4.add('e')
set_array.append(set1)
set_array.append(set2)
set_array.append(set3)
set_array.append(set4)
# venn2([set1, set2], ('Set1', 'Set2')) # venn2 works for two sets
venn3(set_array[0:3], set_names[0:3]) # venn3 works for three sets
plt.show()
Это дает следующий результат: