2016-06-09 277 views
1

我想根據我的熊貓數據框繪製維恩圖。我明白matplotlib_venn接受集作爲輸入。我的數據集包含客戶端ID和另外兩列包含信息,如果客戶端在廣告系列中。用熊貓和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() 

不過,我得到一個錯誤:

File "C:\Python27\Lib\site-packages\matplotlib_venn_venn3.py", line 44, in compute_venn3_areas areas = np.array(np.abs(diagram_areas), float)

TypeError: bad operand type for abs(): 'set'

UPDATE

基於局域網的建議,現在的工作。但由於某些原因,圖表不在一起。但在他們的文檔中,相同的代碼起作用。

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() 

enter image description here

UPDATE 2 - 溶液

最後,最簡單的方法似乎是每個空間的僅插入片段大小,而不是數據集。靈感here

+0

您的套件之間可能沒有重疊。你可以檢查'len(set1&set2)','len(set1&set3)'和'len(set2&set3)'? – IanS

+0

最後,我找到了不同的方法。而不是插入數據集,我只把這個數字,下面的例子:http://matthiaseisen.com/pp/patterns/p0144/ – HonzaB

+0

感謝您接受我的答案:) – IanS

回答

1

我相信你需要通過3套。基於code here,如果您傳遞三個子集,那麼它們會在傳遞給compute_venn3_areas之前轉換爲元組,然後np.abs可以處理它們。只通過2組的情況看起來像一個未處理的錯誤。

+0

你是對的,就是這樣。但是,輸出並不如預期的那樣。 – HonzaB

0

這個錯誤是由於試圖強行將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()