NetworkX结合Pydot绘图时节点与边标签无法显示的问题如何解决
问题核心原因
pydot调用Graphviz渲染时,仅会将名为label的属性作为节点、边的显示文本,你当前存储的节点文本属性为Title、边文本属性为statement,不符合Graphviz的属性命名要求,因此无法显示自定义标签。
修复方法
修改networkx2dot函数中节点、边的属性转换逻辑,将对应的自定义属性映射为label:
- 节点部分:将
Title属性的值赋值给label字段 - 边部分:将
statement属性的值赋值给label字段
修复后完整代码
import pydot import networkx as nx from IPython.display import Image def networkx2dot(G): strict = nx.number_of_selfloops(G) == 0 and not G.is_multigraph() GDOT = pydot.Dot("OKRMAP", graph_type="digraph", strict=strict) #rankdir="LR" GDOT.graph_defaults = G.graph.get("graph", {}) GDOT.set_node_defaults(shape='box', style="filled", color="black", fillcolor="white", fontname='helvetica') GDOT.set_edge_defaults(fontname='helvetica') for n, nodedata in G.nodes(data=True): if n !=None: str_nodedata = {k: str(v) for k, v in nodedata.items()} # 将Title映射为Graphviz识别的label属性 str_nodedata['label'] = str_nodedata.pop('Title') dotnode = pydot.Node(str(n), **str_nodedata) GDOT.add_node(dotnode) for u, y, edgedata in G.edges(data=True): if y !=None: str_edgedata = {k: str(v) for k, v in edgedata.items()} # 将statement映射为Graphviz识别的label属性 str_edgedata['label'] = str_edgedata.pop('statement') dotedge = pydot.Edge(str(u), str(y), **str_edgedata) GDOT.add_edge(dotedge) return GDOT GDOT = networkx2dot(G) GDOT.write_png('tmp.png') Image('tmp.png')
额外优化提示
你提供的G.edges输出中存在重复边,若不需要重复渲染边,可提前检查NetworkX加边逻辑,避免重复添加相同的边。
内容的提问来源于stack exchange,提问作者Ellomorce
相关产品推荐
相关产品推荐

