如何将GraphViz属性应用于networkx / pygraphviz



我使用networkx(v2.5)进行依赖性分析问题,并通过ubuntu 20.04上的graphviz/pygraphviz(v1.7)可视化数据。每个节点的内容(label字段)是一个代码块-所以我希望它左对齐。问题是我似乎不能改变默认值(中心对齐)。

X/Y:-我的具体需求是从networkx图形中生成png,其中节点文本为左对齐-我相信Graphviz/pygraphviz是最好的~简单的方法-但任何自由/开源软件方法都可以完成这一点。

我通过下面的简化代码成功地生成了一个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

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

似乎存在(未记录的,AFAICT)上游/本机graphviz行为,而不是继承图级属性。

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

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

同样,对于文本对齐,可以在每行中进行控制通过改变"l"(注意:这在python中是两个字节,因为它不是一个实际的转义字符)和"r"(分别)的左和右结束行。

这将左对齐所有行

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

最新更新