【问题标题】:How to get the labels of nodes and egdes from read_dot如何从 read_dot 获取节点和 egdes 的标签
【发布时间】:2018-01-22 19:08:26
【问题描述】:

我有一个表示有向图的点文件 (DiGraph)。我希望在 networkx DiGraph 对象中读取它。 我使用了networkx.drawing.nx_agraph.read_dot(PATH),但是此函数返回的图表中的节点只是简单的'str' 类型,并且标签在翻译中都丢失了

Dotfile 是这样的:

digraph code {
    graph [bgcolor=white fontname="Courier" splines="ortho"];
    node [fillcolor=gray style=filled shape=box];
    edge [arrowhead="normal"];
    "0x000052c0" -> "0x00003a40" [label="section..text" color="red" URL="section..text/0x00003a40"];
    "0x00003a40" [label="section..text" URL="section..text/0x00003a40"];
    "0x000052c0" -> "0x0021ee08" [label="reloc.__libc_start_main_8" color="green" URL="reloc.__libc_start_main_8/0x0021ee08"];
    "0x0021ee08" [label="reloc.__libc_start_main_8" URL="reloc.__libc_start_main_8/0x0021ee08"];
}

我为阅读这个文件而写的是这样的:

import networkx as nx
G = nx.drawing.nx_agraph.read_dot(DOT_GRAPH_NAME)

谁有更好的方法?我可以自己写,但最好有一些工作和测试的东西。

【问题讨论】:

  • 更好的方法是什么?渲染图表?如果您向我们展示您的 DOT 文件,也许我们可以提供帮助。
  • 我的意思是一种将点文件读入 netwoorkx 图形对象的更好方法。点文件很大,但我会发布几行
  • 关注图表中可以渲染的可用部分,一个小的子集,让我们看看我们是否可以解决您的标签问题。
  • 我添加了一个可以渲染的简单示例。读取的节点只是引号中的地址。括号里的东西全丢了。边是两个节点之间的箭头符号
  • 很明显 networkx 不尊重正确的点语法,因为使用 GraphViz 2.38 对我来说,你的图表看起来很好。如果您愿意,我会根据此发布答案。

标签: python graph networkx dot


【解决方案1】:

从源代码文件networkx/drawing/nx_agraph.py可以找到如下代码:

# add nodes, attributes to N.node_attr
for n in A.nodes():
    str_attr = {str(k): v for k, v in n.attr.items()}
    N.add_node(str(n), **str_attr)
...
N.graph['node'] = dict(A.node_attr)

所以,节点属性也被解析了。您可以通过

找到此字段
vars(g)

就我而言,我可以通过

获得标签
for node_id in g.nodes:
    print g._node[node_id]['label'] # here, 'node_id' is the 'str' you said

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2019-04-16
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多