如何将NetworkX带节点颜色、尺寸的图导出为样式一致的Graphviz图
解决NetworkX导出GraphViz dot文件丢失节点样式问题
问题原因
write_dot 导出时只会保存图的拓扑结构,不会自动将 nx.draw_networkx 传入的样式参数写入节点/边的属性中,因此生成的dot文件没有颜色、大小等样式信息,GraphViz渲染时会使用默认样式。
解决方法
在导出dot前,将你计算好的样式参数直接作为属性写入NetworkX图的节点中,属性名要和GraphViz支持的样式字段对应。
修改后的完整代码
import networkx as nx import matplotlib.cm as cm import matplotlib.colors as cl from networkx.drawing.nx_agraph import write_dot G = nx.DiGraph() G.add_edges_from([('A', 'B'),('A', 'B'), ('A', 'B'), ('A', 'C'), ('A', 'C'), ('A', 'C'),('C', 'C'), ('A', 'D'), ('E', 'D'), ('D', 'F'), ('E', 'C'), ('E', 'G'), ('B', 'H'), ('H', 'F')]) pos = nx.spring_layout(G) cen = nx.betweenness_centrality(G) # 新增:将样式写入节点属性,和GraphViz字段对应 for node in G.nodes(): # 节点填充色,对应原coolwarm色阶 G.nodes[node]['fillcolor'] = cl.to_hex(cm.coolwarm(cen[node])) # 开启填充样式,否则颜色不生效 G.nodes[node]['style'] = 'filled' # 节点大小,系数可根据实际显示效果调整 G.nodes[node]['width'] = cen[node] * 100 # 可选:保留原spring_layout的节点位置,避免GraphViz重新布局 G.nodes[node]['pos'] = f"{pos[node][0]},{pos[node][1]}!" # 导出带样式的dot文件 write_dot(G,'graph_ex.dot') # 可选:直接用pygraphviz渲染成图片,无需手动调用dot命令 # ag = nx.nx_agraph.to_agraph(G) # ag.draw('graph_result.png', prog='dot')
注意事项
- 节点大小的系数可以根据渲染效果调整,如果你希望和原NetworkX绘制的大小完全匹配,可以根据两个工具的尺寸单位换算后调整系数值
- 边的样式也可以用相同的逻辑,通过
G.edges[edge]['属性名'] = 值的方式写入,比如设置边的颜色、粗细等
内容的提问来源于stack exchange,提问作者user1480478
相关产品推荐
相关产品推荐

