使用相关矩阵创建图形
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。
首先,您的边缘函数将边缘添加两次(从 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)
这给你一个 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)
。
我在解决这个问题时遇到了一些问题,我有一个数据框,我需要从中创建一个图表。
我的数据框看起来像:
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。
首先,您的边缘函数将边缘添加两次(从 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)
这给你一个 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)
。