我在解决这个问题时遇到了一些问题,我有一个数据框,我需要从中创建一个图表。
我的数据框架如下:
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相同,因此重复了一些边缘,我无法弄清楚如何去除重复的值。 从这些数据我需要创建一个图形/图片。
谢谢!
答案 0 :(得分:0)
创建图片的方法有很多种。我将展示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)
。