【问题标题】:how to apply GraphViz attrs to networkx / pygraphviz如何将 GraphViz 属性应用于 networkx / pygraphviz
【发布时间】:2021-05-18 23:33:18
【问题描述】:

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

X/Y: - 我的具体需要是从 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 中的节点文本(特别是左对齐)?

【问题讨论】:

    标签: python networkx graphviz pygraphviz


    【解决方案1】:

    似乎有(无证,AFAICT)上游/原生graphviz行为w.r.t。继承图级属性。

    设置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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-26
      • 2016-09-18
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多