2017-06-02 61 views
8

我想使用matplotlib來生成帶有分類行和列標籤的pandas DataFrame的散點圖。示例DataFrame如下所示:使用分類標記的行/列繪製熊貓DataFrame的散點圖

import pandas as pd 
df = pd.DataFrame({"a": [1,2], "b": [3,4]}, index=["c","d"]) 
# a b 
#c 1 2 
#d 3 4 

標記大小是各個DataFrame值的函數。到目前爲止,我想出了一個尷尬的解決方案,本質上列舉的行和列,繪製數據,然後重建標籤:

flat = df.reset_index(drop=True).T.reset_index(drop=True).T.stack().reset_index() 
# level_0 level_1 0 
#0  0  0 1 
#1  0  1 2 
#2  1  0 3 
#3  1  1 4 

flat.plot(kind='scatter', x='level_0', y='level_1', s=100*flat[0]) 
plt.xticks(range(df.shape[1]), df.columns) 
plt.yticks(range(df.shape[0]), df.index) 
plt.show() 

哪種作品。 Which kind of works

現在,問題:是否有更直觀,更集成的方式來產生散點圖,理想情況下不需要拆分數據和元數據?

+0

,我不認爲我們可以用非數值數據繪製。 AFAIK你將不得不單獨設置刻度... – MaxU

+1

我想這個問題轉化爲*「爲什麼沒有庫實現我的自定義繪圖的願望功能呢?」*。 – ImportanceOfBeingErnest

回答

7

也許不是一個完整的答案你尋找,但有一個想法,以幫助節省時間和flat=代碼行的可讀性。

熊貓unstack方法將產生一個系列與MultiIndex

dfu = df.unstack() 

print(dfu.index) 
MultiIndex(levels=[[u'a', u'b'], [u'c', u'd']], 
      labels=[[0, 0, 1, 1], [0, 1, 0, 1]]) 

MultiIndex contains包含構造圖的必要x和y點(在labels中)。在這裏,我將levelslabels分配給更適合繪圖的更多信息豐富的變量名稱。

xlabels, ylabels = dfu.index.levels 
xs, ys = dfu.index.labels 

從這裏開始繪圖很簡單。

plt.scatter(xs, ys, s=dfu*100) 
plt.xticks(range(len(xlabels)), xlabels) 
plt.yticks(range(len(ylabels)), ylabels) 
plt.show() 

enter image description here

我想這在幾個不同的DataFrame形狀,它似乎托起。

4

這不正是你問什麼,但它有助於以類似的方式來可視化值:

import seaborn as sns 

sns.heatmap(df[::-1], annot=True) 

結果:

enter image description here

+0

呃...那是海豹,而不是matplotlib。但是,謝謝! – DyZ

3

也許你可以使用numpy的陣列和pd.melt創建散點圖,如下圖所示:

arr = np.array([[i,j] for i in range(df.shape[1]) for j in range(df.shape[0])]) 
plt.scatter(arr[:,0],arr[:,1],s=100*pd.melt(df)['value'],marker='o') 
plt.xlabel('level_0') 
plt.ylabel('level_1') 
plt.xticks(range(df.shape[1]), df.columns) 
plt.yticks(range(df.shape[0]), df.index) 
plt.show() 

enter image description here