2017-08-25 20 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」(上三角)カラム

iは色を達成するために必要に応じてフォーマットする細胞であります下の書式設定( NUM1/NUM2値に基づいて、しかし、私はセルに表示される値iがseabornヒートマップ機能を認識してい

enter image description here

上の行列に対応したいが、私はに対処する提案を見つけることができませんされて表示変数と書式設定変数の違い。どのようなアドバイスや例がありがとうございます

答えて

0

私は問題を2つの部分に分けるべきだと思います。第1の方法は、列形式のデータを与えられた場合に、それぞれの相関行列を得る方法である。 x-y/y-x(以下のコードではpと呼ばれます)とnum1/num2(別のコードではnと呼ばれます)の2つが必要です。 2つの列はちょうど反対の符号であるので、上の三角形が両方の場合の下三角をちょうど差し引いたように少し単純化するかもしれない。これが完了すると、視覚化の問題は確かにseaborn.heatmapを使用して1行です。

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)row = nyc/col = lax:+10 2)row = sfo/col = chi:+ 9 これらの値を「nyc-lax」および「sfo (私のせいで) ここで正しく捕捉されない "yx"か "xy"のいずれかが反映されます。私の最終的なアプローチは、データフレームを使用することでした与えられたように完全なパーミュテーションを持っていて-1 *下三角を気にする必要はなく、それに応じて結合/ピボットする – laszlopanaflex

+0

下三角を使用するのはここのショートカットです。相関が対称でない場合は、 '' yx ''と' num2'のピボットを作成し、 'p'と' n'の上三角をそれらのピボットの値で置き換える必要があります。 'x-y'と' num1'カラムだけで、最初の2つのカラムにすべての可能な順列を持つデータフレームから始めることはもちろん同様に可能です。 – ImportanceOfBeingErnest

関連する問題