2017-03-29 14 views
1

この問題を解決するにはいくつかの問題がありますが、データフレームがあり、そこからグラフを作成する必要があります。相関行列を使ってグラフを作成する

A =pd.DataFrame([(1, 0.3, 0.4, 0.7), 
        (0.3, 1, 0.9, 0.2), 
        (0.4, 0.9, 1, 0.1), 
        (0.7, 0.2, 0.1, 1) 
        ], columns=['a', 'b', 'c', 'd'], index=['a', 'b', 'c', 'd']) 
    np.fill_diagonal(A.values, 0) 
>>> A 
    a b c d 
a 0.0 0.3 0.4 0.7 
b 0.3 0.0 0.9 0.2 
c 0.4 0.9 0.0 0.1 
d 0.7 0.2 0.1 0.0 

私は、このデータでグラフを作成したい:

マイデータフレームは次のようになります。 a、b、c、dの4つのノードがあり、ノード間の距離は、a-b = 0.3のノード間の距離などの行列によって与えられます(これは相関行列の値が複製されるためです)。

ありがとうございました!

私は(それは最高のアイデアであるかどうかはわからない)辞書としてエッジの値を格納するために、この関数を作成しました:

def edges(matr): 
    edge = {} 
    for m in matr.columns: 
     for n in matr.index: 
      a,b = m,n 
      if a!= b: 
       x = matr.at[m, n] 
       edge[m,n] = float("{0:.4f}".format(x)) 
    return edge 

edges(A) 

>>> edges(A) 
{('a', 'b'): 0.3, 
('a', 'c'): 0.4, 
('a', 'd'): 0.7, 
('b', 'a'): 0.3, 
('b', 'c'): 0.9, 
('b', 'd'): 0.2, 
('c', 'a'): 0.4, 
('c', 'b'): 0.9, 
('c', 'd'): 0.1, 
('d', 'a'): 0.7, 
('d', 'b'): 0.2, 
('d', 'c'): 0.1} 
しかし、ABは、いくつかの縁BAと同じであるため、繰り返された値を取り除く方法はわかりません。 そしてそのデータから私はグラフ/画像を作成する必要があります。

ありがとうございました!

+0

おそらく疑問な質問ですが、どのようなグラフですか?特定のデータ構造ですか?絵? – doctorlove

+0

エッジと距離のリスト、およびグラフ/画像を作成します。ありがとう! – Mee

答えて

0

画像を作成する方法はいろいろあります。私はgraphvizを表示します。

まず、エッジ機能を使用してエッジを2回追加します(aからbに戻ってもう一度追加します)。

import graphviz as gv 

def edges(matr): 
    edge = {} 
    for m in matr.columns: 
     for n in matr.index: 
      a,b = m,n 
      if a > b: #only add edge once 
       x = matr.at[m, n] 
       edge[m,n] = float("{0:.4f}".format(x)) 
    return edge 

if __name__ == '__main__': 
    A =pd.DataFrame([(1, 0.3, 0.4, 0.7), 
       (0.3, 1, 0.9, 0.2), 
       (0.4, 0.9, 1, 0.1), 
       (0.7, 0.2, 0.1, 1) 
       ], columns=['a', 'b', 'c', 'd'], index=['a', 'b', 'c', 'd']) 
    np.fill_diagonal(A.values, 0) 

    e = edges(A) 
    g = gv.Graph(format="png") 
    for k, v in e.iteritems(): 
     g.edge(k[0], k[1], len=str(v)) 

    print str(g) 

これは、あなたが.dotファイルに保存している場合は、例えば、外部からGraphvizのツールにそれを送ることができるあなたのgraphvizの形式

graph { 
     b -- a [len=0.3] 
     c -- a [len=0.4] 
     c -- b [len=0.9] 
     d -- a [len=0.7] 
     d -- c [len=0.1] 
     d -- b [len=0.2] 
} 

を与えますdot -Tps g.dot -o g.pngまたはg.render('filename', view = True)をpythonで実行してください。

Generated graph

+0

関数edges()を修正していただき、ありがとうございます。しかし、 'e.iteritems()内のk、v:g.edge(k [0]、k [1]、len = str(v))'はエラーを出します:NameError:name 'e'は定義されていません。ありがとうございました!! – Mee

+0

ああ - もちろん - あなたは 'e = edges(A)'を必要とします - 編集された答え – doctorlove

+0

'e.iteritems()'は私のために働いていなかったので、 'e.items()'に変更しました。あなたの答えをありがとう! – Mee

関連する問題