我使用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")