用相关矩阵创建图形

时间:2017-03-29 13:09:29

标签: python graph-theory

我在解决这个问题时遇到了一些问题,我有一个数据框,我需要从中创建一个图表。

我的数据框架如下:

npm run ng <command>

我想用这些数据创建一个图表。有四个节点:a,b,c,d,节点之间的距离由矩阵给出,例如,节点a-b之间的距离= 0.3(因为它是重复的相关矩阵值)。

谢谢!

我创建了这个函数来将edge的值存储为dict(我不知道这是不是最好的想法):

    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与b-a相同,因此重复了一些边缘,我无法弄清楚如何去除重复的值。 从这些数据我需要创建一个图形/图片。

谢谢!

1 个答案:

答案 0 :(得分:0)

创建图片的方法有很多种。我将展示graphviz。

首先,你的边缘函数会将边缘添加两次(从ab然后再添加),所以让我们只添加一次。

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)

这为您提供了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文件,您可以将其发送到外部的graphviz工具,例如: dot -Tps g.dot -o g.png或在python中执行g.render('filename', view = True)

Generated graph

相关问题