【问题标题】:Generate adjacency matrix in graphviz在graphviz中生成邻接矩阵
【发布时间】:2017-09-29 14:22:47
【问题描述】:

我想知道是否可以使用 graphviz 生成邻接矩阵的图像。例如来自这个文件:

digraph { 
    A -> B; 
    B -> C; 
    A -> C; 
    D -> C; 
    E -> C; 
    E -> A; 
}

结果应该是这样的:

如果不行,有没有其他软件可以用?

【问题讨论】:

  • 不确定其他人是否能理解您的问题。我不。建议把你想得到的图片放在最后。

标签: graphviz dot adjacency-matrix


【解决方案1】:

这里有一些想法:

我不知道允许 graphviz 打印矩阵的功能,但是,如果输入的 graphviz 代码相对干净(没有属性或奇怪的节点),我看不出它有多难编写一个简单的解析器来产生所需的输出。

你可以做一些简单的事情,比如下面的例子(python):

import pprint
# Example input file with "digraph g {" elided for simplicity:
s = """A -> B; 
    B -> C; 
    A -> C; 
    D -> C; 
    E -> C; 
    E -> A; """
lines = s.split("\n")
all_edges = []
pairs = []
for line in lines:
    edge = line.replace(";", "").replace(" ", "").split("->")
    if len(edge) == 2:
        all_edges.append(edge[0])
        all_edges.append(edge[1])
        pairs.append(edge)

unique_edges = set(all_edges)

matrix = {origin: {dest: 0 for dest in all_edges} for origin in all_edges}
for p in pairs:
    matrix[p[0]][p[1]] += 1
pprint.pprint(matrix)

完成后,输出如下所示,您可以编写更多代码来输出 html 或您选择的任何表格格式:

"""
Output:
{'A': {'A': 0, 'B': 1, 'C': 1, 'D': 0, 'E': 0},
 'B': {'A': 0, 'B': 0, 'C': 1, 'D': 0, 'E': 0},
 'C': {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0},
 'D': {'A': 0, 'B': 0, 'C': 1, 'D': 0, 'E': 0},
 'E': {'A': 1, 'B': 0, 'C': 1, 'D': 0, 'E': 0}}
 """

我希望这会有所帮助!

【讨论】:

  • 感谢您的回答。我粘贴的示例有向图代码是 DOT 语言。它可用于生成带有cat digraph.dot | dot -Tpng -o digraph.png 的有向图图像。我还没有找到在 DOT 中生成邻接矩阵的方法。我之前也尝试过 HTML 的东西,它开始滞后于 300 多个节点的图,但也许我做错了什么。
  • 也许如果 dot 不适合你考虑 gephi