如何将 GraphViz attrs 应用于 networkx / pygraphviz

how to apply GraphViz attrs to networkx / pygraphviz

我正在使用 networkx (v2.5) 解决依赖性分析问题,并通过 graphviz / pygraphviz (v1.7) 在 ubuntu 20.04。每个节点的内容(label 字段)是一个代码块 - 所以我希望它左对齐。问题是我似乎无法更改默认值(中心对齐)。

X/Y: - 我的具体需要是从节点文本为 [=27 的 networkx 图表制作 png =]左对齐 - 我相信 Graphviz/pygraphviz 是最好的~简单的方法 - 但任何 FOSS 方法都可以做到这一点。

我通过以下简化代码成功生成了一个 png,但文本全部 居中对齐

from networkx import DiGraph, nx_agraph
from networkx.drawing.nx_agraph import write_dot

# graph is created via networkx:
graph = DiGraph()
graph.add_edge("node1", "node2")
graph.nodes["node1"]["label"] = get_code_sniped("node1")
# ...

# and converted / output to dot & png via (internally) pygraphviz
write_dot(graph, "/tmp/foo.dot") # appears correctly output
a_graph = nx_agraph.to_agraph(graph)
a_graph.layout(prog="dot")

# attempt to add attrs per defs in 
# https://www.graphviz.org/doc/info/attrs.html#d:labeljust
a_graph.graph_attr.update(labeljust="l")  #  <----- has no effect on output
a_graph.graph_attr.update(nojustify=True) #  <-/

a_graph.draw("/tmp/foo.png") # <-- PNG outputs successfully, 
#                                  but all node text is CENTER justified

如何修改从我的 networkx 图形生成的 PNG 中的节点文本(特别是左对齐)?

似乎存在(未记录,AFAICT)upstream/native graphviz 行为 w.r.t。继承图级属性。

设置 a_graph.graph_attr.update(... 是不够的,因为它不被子元素继承。例如,为了设置 fontname,以下工作:

for node in formattable_graph.iternodes():
    node.attr["fontname"] = "Liberation Mono"

此外,对于文本对齐,可以通过更改结尾 "\l" 的行在 每行 的基础上进行控制(注意: 中的两个字节=29=] 因为它不是实际的转义字符)和 "\r" 左右(分别)。

这将左对齐所有行

graph.nodes["node1"]["label"] = """my
  node label
  with newlines
""".replace("\n", "\l")