2017-08-31 37 views
0

我有一個有4列和幾千行的熊貓數據框。所有條目都是True或False。我們調用數據框'df'和列'c0','c1','c2'和'c3'。我感興趣的多少行各有2^4 = 16個可能的真值的,所以我讓自己交叉列表:從熊貓交叉表製作氣泡圖

xt = pd.crosstab([df.c0,df.c1],[df.c2,df.c3]) 
print(xt) 

顯示單元的一個不錯的4×4表,包含每個單元具有真值組合的行數。更好的是,這16個單元的空間佈局對我來說是有意義和有用的。好,一切都很好。但我如何繪製它?

具體來說,我想製作這些交叉表計數的氣泡圖,圖表表示與表中所示的相同空間排列中的交叉表數據,但現在用各色與計數成正比的區域(比如說一圈)。因此,這是一個散點圖,其中沿着一個軸的四個(c0,c1)真值,沿着另一個軸的四個(c2,c3)真值以及不同大小的圓的4x4規則網格。

我知道我可以通過將尺寸數據傳遞給matplotlib分散函數的's'關鍵字來製作氣泡圖,但是我找不出一種簡單的方式告訴熊貓做一個使用列標題的散點圖作爲x座標,將行標題作爲y座標,並將數據值作爲散點圖的氣泡大小。通過將我的數據框轉換爲一個numpy數組並繪製該數組,我得到了一些運氣,但是然後我失去了交叉表中軸標籤的結構。 (是的,我可以手工重建刻度標籤,但是我希望能夠通過其他類似數據集的算法重現此任務。)編輯:由@piRSquared下面的答案啓發,這裏是一些澄清我所要求的。此代碼接近我想要的,但結果圖上的軸已丟失有關交叉表對象的分層MultiIndex標籤結構的任何信息。

import pandas as pd 
import numpy as np 

randomData=np.random.choice([True,False],size=(100, 4),p=[.6,.4]) 
df = pd.DataFrame(randomData, columns=['c0','c1','c2','c3']) 
xt=pd.crosstab([df.c0,df.c1], [df.c2,df.c3]) 

x=np.array([range(4)]*4) 
y=x.transpose()[::-1,:] 
pl.scatter(x,y,s=np.array(xt)*10) 

(鏈接到繪製的圖像,因爲我沒有足夠的聲譽嵌入:a scatter plot with poorly labelled axes)理想的軸標籤將有來自交叉對象的基本多指標得出的視覺平整結構,有點像這個:

c2   False  True  
c3   False True False True 
c0 c1       
False False  0  8  4  9 
     True  3  2  4 10 
True False  7  5  3 10 
     True  2  7  8 18 

或者,也許,讓人聯想到的東西是什麼傳說和x軸表示在這裏:

xt.plot(kind='bar',stacked=True) 

(另一個情節圖像鏈接:a stack plot that knows about the multiindex nature of its underlying dataframe

回答

1

希望這有助於

df = pd.DataFrame(
    np.random.choice(
     np.arange(6), 
     size=(100, 2), 
     p=np.arange(1, 7)/21 
    ), columns=list('AB') 
) 

c = pd.crosstab(df.A, df.B).stack().reset_index(name='C') 

c.plot.scatter('A', 'B', s=c.C * 10) 

enter image description here

+0

這接近完成工作(是真聰明!),但在一部開拓創新問題的交叉表multiindexed,這不是很明顯對我來說如何推斷這個答案multiIndex的情況。 –

+0

這對我來說並不明顯,你希望它看起來如何。你可以畫出來,拍照併發布。 – piRSquared

+0

好吧,我會編輯我的帖子,以澄清我要求的。 –