如何将 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")
我正在使用 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")