You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:57:02