使用相关矩阵创建图形

create graph with correlation matrix

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

我的数据框看起来像:

    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,节点之间的距离由矩阵给出,例如,节点 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}

但是由于 a-b 与 b-a 相同,所以有些边重复了,我不知道如何删除重复的值。 根据这些数据,我需要创建一个 graph/picture.

谢谢!!

创建图片的方法有很多种。我会展示 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)