networkx使用Graphviz画图要点

本文涉及的工具

import networkx as nx
G1 = nx.MultiDiGraph()
node = ['A', 'B', 'C', 'D', 'E']
edge = [('A', 'B'), ('B', 'C'), ('C', 'D'),('C', 'E')]
for i in node:
    G1.add_node(i)
for i in edge:
    G1.add_edge(i[0], i[1])
G1.graph['edge'] = {'arrowsize': '0.5'} # 箭头大小
G1.graph['node'] = {'shape':'box'} # 节点形状
G1.graph['graph'] = {'splines': 'spline', 'rankdir':'LR'} # 线型与布局方向
A = to_agraph(G1)
A.layout('dot') # 布局方法
A.draw('./graph/test2.png')

请添加图片描述

1.修改节点边框颜色
G.add_node(node, color="red")

请添加图片描述

2. 修改节点背景颜色
G1.add_node(i, style='filled')
G1.graph['node'] = {'shape':'box', 'color':'red'}

请添加图片描述

3.中文乱码

在上述图中增加一个中文节点,发现中文无法正常显示请添加图片描述
解决方法,在节点属性中添加指定中文字体,即可正常显示

G1.graph['node'] = {'shape':'box', 'color':'red', 'fontname':'FangSong'}

请添加图片描述

4. 其他节点与边属性

节点形状(shape),节点的高度宽度或半径(width,height),边的长度(len),边的线形(spline),箭头大小(arrowsize),箭头方向(dir)等等,每个属性内部的内容详见Graphviz官网

5. 图形布局要点
  • Graphviz使用自动排版,提供了多种布局引擎,个人比较喜欢dot和neato排版,如果节点较多且节点标签文字比较长的话建议使用dot排版,否则neato排版更紧凑些,如下图所示。
    请添加图片描述

  • 当使用dot排版时,不建议使用curved曲线,因为该线形会穿过节点,影响美观性,建议使用spline样条线以及ortho正交线。下图展示了使用dot排版和curved曲线,可以看到部分曲线穿过了节点(为了隐去部分敏感数据信息,将中文字体使用乱码掩盖)
    请添加图片描述

  • 当画图时发现布局较难看的时候,可以尝试给边添加标签和权重,通过添加标签会对线条布局机制产生一定的影响,而权重则影响边的长度,权重越大的边,越短且越直。下面通过一个案例说明添加标签与权重对布局的影响。

  1. 第一幅图为使用dot布局机制和spline样条线,未添加标签和权重时的结果,可以看到左侧存在一条较粗的线对图片的美观程度产生较大影响。
    请添加图片描述

  2. 添加标签,可以看到布局发生了调整,第一幅中左侧较粗的线现在调整到了图的中部
    请添加图片描述

  3. 添加权重,那根较粗的线变成了垂直的线,图结构更加清晰,布局美观
    请添加图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值