2017-08-25 66 views
0

我在尋找以下方面的幫助:給定一個數據框,我想顯示一個'矩陣'圖,其值對應於表中的一對,但根據對應於該對的不同列的值的「熱圖」。這裏是示例性數據:基於數據框的條件格式的'矩陣'圖

df_list = [('nyc', 'lax', 10,-10, -2,2),('nyc', 'chi', -9,9, -2,2),('nyc', 'sfo', -4,4,-1,1),('nyc', 'mia', 2,-2, 2,-2),('lax', 'chi', 5,-5, 1,-1),('lax', 'sfo', -8,8, 2,-2), 
      ('lax', 'mia', -6,6,0,0),('chi', 'sfo', 9,-9, -1,1),('chi', 'mia', 1,-1,3,-3),('sfo', 'mia', -3,3, -2,2)] 

df = pd.DataFrame(df_list, columns=['x', 'y','x-y','y-x','num1','num2']) 

所以在Excel中,未格式化的結果可能看起來像這樣在「XY」顯示的值(下三角)和「YX」(上三角)列

enter image description here

但是,我想在python是細胞根據值在「NUM1」的分佈(下三角)或「NUM2」(上部三角)柱

我想要實現的顏色來格式化格式如下(其中是基於NUM1/NUM2值,但我想在單元格中顯示的值對應於矩陣上

enter image description here

我是知道的seaborn熱圖功能,但我不能找到一個建議,考慮到顯示變量和格式變量之間的區別。任何意見或例子,將不勝感激

回答

0

我認爲應該把問題分成兩部分。第一種情況是,以列形式給出數據,如何獲得各自的相關矩陣。我們需要一個用於x-y/y-x(在下面的代碼中稱爲p),另一個用於num1/num2(在下面的代碼中稱爲n)。由於兩列的符號相反,因此我們可能會簡化一些東西,使得上三角形只是減去兩個案例中較低的一個。一旦完成,問題是可視化確實是使用seaborn.heatmap的單行。

sns.heatmap(n, annot = p) 

完整的示例:

import seaborn as sns 
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 

df_list = [('nyc', 'lax', 10,-10, -2,2),('nyc','chi',-9,9,-2,2),('nyc', 'sfo',-4,4,-1,1), 
      ('nyc', 'mia', 2,-2, 2,-2),('lax','chi',5,-5,1,-1),('lax', 'sfo', -8,8, 2,-2), 
      ('lax', 'mia', -6,6,0,0),('chi', 'sfo', 9,-9, -1,1),('chi', 'mia', 1,-1,3,-3), 
      ('sfo', 'mia', -3,3, -2,2)] 

df = pd.DataFrame(df_list, columns=['x', 'y','x-y','y-x','num1','num2']) 

u = np.unique(df[["x","y"]].values) 

p1 = df.pivot("y","x","x-y").reindex(u,u) 
p2 = df.pivot("x","y","x-y").reindex(u,u) 
p = p1.combine_first(p2) 
utri = np.triu(np.ones(p.shape)).astype(np.bool) 
p.values[utri] = -p.values[utri] 

n1 = df.pivot("y","x","num1").reindex(u,u) 
n2 = df.pivot("x","y","num1").reindex(u,u) 
n = n1.combine_first(n2) 
n.values[utri] = -n.values[utri] 

# color according to n, labels according to p 
sns.heatmap(n, annot = p, center=0, cmap="RdBu") 

plt.show() 

enter image description here

+0

這是一個非常優雅的答案,但我只注意到一個問題,我原來的職位。考慮這兩個例子: 1)行= NYC/COL =鬆懈:10 2)行= SFO/COL =志:9 我的意圖是介紹這些值作爲 「NYC-LAX」 和「SFO 「基於我的數據幀結構」將反映「yx」或「xy」,這裏不會被正確捕獲(我的錯誤) 所以,我認爲在我的最後的正確方法是使用數據幀它具有完整的排列,因此不必擔心-1 *下三角形並相應地合併/旋轉 – laszlopanaflex

+0

使用下部/上部三角形只是一個捷徑。如果相關不對稱,則需要爲''yx「'和'num2'創建支點,並用來自這些支點的值填充」p「和」n「的上三角形,而不是來自它們自身的倒數值。從只有'x-y'和'num1'列的數據框開始,但前兩列中所有可能的排列當然也是可能的。 – ImportanceOfBeingErnest