graphviz 学习

#graphviz 学习

# 在安装完Graphviz后,并将路径填入系统环境变量PATH中,
# 或用下述方法添加 ,注意加上r
# 写明graphviz的bin文件目录
import os
#os.environ["PATH"] += os.pathsep + r"D:\Software_install\graphviz-2.46.1\Graphviz\bin"
os.environ["Path"] += os.pathsep + r"D:\Software_install\graphviz-2.46.1\Graphviz\bin"
print(os.pathsep)# 分号

# pip install graphviz
import graphviz
graphviz.version()
# (2, 46, 1)
# 双击可jupyter notebook隐藏结果,单击可展开隐藏的结果。

创建主图
dot = graphviz.Digraph(name=‘G’,format=“png”, filename=‘angles.gv’,node_attr={‘shape’: ‘record’, ‘height’: ‘.1’},fontsize=‘11’)
实例化一个Digraph对象(有向图)
name:生成的图片的图片名,format:生成的图片格式
dot.attr(compound=‘true’)
dot.attr(rankdir=‘LR’, size=‘8,5’)
使用graph_attr,node_attr,and edge_attr参数来改变图,节点,连接的默认显示。
可以通过使用Digraph(strict=True)或类似的初始化图形来避免多条边。这样如果稍后添加一个同名的新节点,Graphviz本身会替换原有的节点。

设置图属性
dot.attr(bgcolor=‘blue’)
加入节点
dot.node(name=‘node0’, label=graphviz.nohtml(‘ | G|’), shape=‘record’,
color=“lightsalmon”, style = “filled”, fontname=“Microsoft YaHei”)
name:这个节点对象的名称,
label:节点名,如果label以<开头,以>结尾的话,引擎按照HTML-like标签进行解析。
node shape值为 record正方型 或者Mrecord圆角正方型 时, 节点就是记录节点,其内容由label定义。
rankdir值不同时,分割行或者列相互转换
用 | 分割多列,用 标记行的port值,箭头可指向其准确位置 ,用{ | } 分割多行
使用"\n", “\l” and "\r"分割label内容为多行:\n换行居中对齐;\l 靠左对齐;\r 靠右对齐
label=“node0 \n第一个开始节点\l节点说明\r是这样子\l对齐的是吧\l靠对齐”
节点label属性的内容可以是html,通常情况是一个tabel,可以指定其属性样式等html所支持的标签。
digraph {
d[label=<

11 22
33 44
>];
c->d:f2;
e->d:l3;
}

对于字面上应该以 开头’<‘和结尾的字符串’>‘,使用该graphviz.nohtml()函数禁用尖括号的特殊含义并应用正常的引用/转义
使用graphviz.nohtml(str) 返回字符串’<…>‘在引用中不被视为 DOT HTML 字符串。即,’<…>'内的内容将被视为字面意思,但在图中不显示。
Args: s: String in which leading '<' and trailing '>' should be treated as literal.
literal adj.字面意义的; 完全按原文的; 缺乏想象力的;n.误印;
[例句]She probably should have vetted this speech But no, I’m talking about sleep in the literal sense
应该事先审查这次演讲不过别想歪了我这里的“睡”是字面意义的
shape 取值:‘Mdiamond’ ‘Msquare’ ‘record’ ,‘egg’,‘star’
color:画节点的线的颜色,取值:“peachpuff”,
style 取值:“filled”,
fontname 防止字体乱码情况,取值:“Microsoft YaHei”)
dot.attr(rank=‘same’) # rank=‘same’ 使得节点的处于同一排列
dot.node(‘A’)
dot.node(‘X’)

节点属性统一设置
dot.attr(‘node’, shape=‘doublecircle’)# 使得以下的节点都是双圆
dot.node(‘LR_0’)
dot.node(‘LR_3’)
dot.node(‘LR_4’)

dot.attr(‘node’, shape=‘circle’)# 使得以下的节点都是圆
dot.edge(‘LR_0’, ‘LR_2’, label=‘SS(B)’)
dot.edge(‘LR_0’, ‘LR_1’, label=‘SS(S)’)

加入边
edges():方法可以一次添加多个边, 每个边用字符串表示, 比如 cb 表示从 c 到 b 的边,即edges画边
edge():方法一次添加一个边
dot.edges([‘ab’, ‘ac’, ‘bd’, ‘cd’])
dot.edges([(‘struct1:f1’, ‘struct2:f0’), (‘struct1:f2’, ‘struct3:here’)])
dot.edge(‘d’, ‘e’, label=‘n’, len=‘1.00’)
dot.edge(‘c’, ‘e’, ltail=‘cluster0’)
dot.edge(‘b’, ‘f’, lhead=‘cluster1’)
dot.edge(‘c’, ‘g’, ltail=‘cluster0’, lhead=‘cluster1’) ## ??
dot.edge(‘e’, ‘clusterB’) # 节点与子图的边
dot.edge(‘clusterC’, ‘clusterB’)# 子图与子图的边
dot.edge_attr.update(arrowhead=‘vee’, arrowsize=‘2’)

添加子图的方法
NOTE: the subgraph name needs to begin with ‘cluster’ (all lowercase)
so that Graphviz recognizes it as a special cluster subgraph
如果name子图的 以’cluster’(全部小写)开头,则布局引擎将其视为特殊的集群子图
有两种使用方法:
第一个选项,graph作为唯一的参数:
p = graphviz.Graph(name=‘parent’)
p.edge(‘spam’, ‘eggs’)
c = graphviz.Graph(name=‘child’, node_attr={‘shape’: ‘box’})
c.edge(‘foo’, ‘bar’)
p.subgraph©

第二种用法,带有with-block(省略graph参数):
with dot.subgraph(name=‘cluster_1’) as c:
# c for cluster
c.attr(fontcolor=‘white’)
c.attr(‘node’, shape=‘circle’, style=‘filled’, fillcolor=‘white:black’,gradientangle=‘360’, label=‘n9:360’, fontcolor=‘black’)
# style 取值 ‘filled’ ‘radial’
c.node(‘n9’)
c.node_attr.update(style=‘filled’, color=‘white’)
c.node_attr[‘style’] = ‘filled’
for i, a in zip(range(8, 0, -1), range(360 - 45, -1, -45)):
# zip中的range取小不取大
c.attr(‘node’, gradientangle=‘%d’ % a, label=‘n%d:%d’ % (i, a))
c.node(‘n%d’ % i)
c.attr(label=‘Linear Angle Variations (white to black gradient)’)

当subgraph()用作上下文管理器时,
通过strict=None 复制 directory、 engine、 format、 renderer、 formatter和encoding 的父 图值来创建新图
这些复制的属性仅与从 with-block 中 独立渲染子图(即作为独立图)相关

弹出查看
dot.view(filename=“水果”, directory=“D:\MyTest”)
把图形画出来,并自动显示图片(弹出来),一般使用view()进行调试
filename:图片的名称,若无filename,则使用Digraph对象的name,默认会有gv后缀
directory:图片保存的路径,默认是在当前路径下保存

print(dot.source) #打印生成的源代码
src = graphviz.Source(‘digraph “the holy hand grenade” { rankdir=LR; 1 -> 2 -> 3 -> lob }’)# 呈现现成的DOT Graph源代码字符串

render():把图形画出来,一般使用render保存图片的时候,view=False(不弹出图片)
直接渲染现有的DOT源文件(例如使用其他工具创建的),您可以使用该graphviz.render()功能。
render() 方法用来生成选定格式的图片。
dot.render(‘test-output/round-table.gv’, view=True)
传入view=True将使用系统默认的程序打开渲染后的图片(pdf,png,svg,等)。

反斜杠转义和形式<…>的字符串在DOT语言 中具有特殊含义。
如果您需要逐字呈现任意字符串(例如,来自用户输入),请考虑先用函数graphviz.escape()包装它们。

arbitrary adj.任意的; 武断的; 随心所欲的; 专横的; 专制的;
[例句]The method is simple comparatively and valid for arbitrary input.本文所述的方法比较简便、且适用于输入为任意的情形。

pipe输出
通过使用 Graph 或者Digraph 的pipe()方法,可以直接的查看Graphviz渲染命令的字符串。

h = Graph(‘hello’, format=‘svg’)
h.edge(‘Hello’, ‘World’)
print(h.pipe().decode(‘utf-8’))

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

值得注意的是渲染的命令返回的是原始的stdout。当像svg或plain输出plain-text格式,需要像上面的代码对返回的值进行解码。

Graph与Digraph对象有一个 repr_mimebundle()方法,因此它们可以直接在Jupyter notebook中呈现和显示。

The edge() and edges() methods use the colon-separated node[:port[:compass]] format for tail and head nodes.
This allows to specify an optional node port plus an optional compass point the edge should aim at
for the given tail or head node
由于冒号用于表示边的port和compass, 因此当前不支持包含一个或多个文字冒号的节点名称。
label参数没有这样的限制,因此您可以通过选择无冒号name 和想要的label来解决。

Graphviz布局引擎支持许多 转义序列,例如\n, \l(\r 用于放置多行标签: 居中、左对齐、右对齐)
和\N, \G(\L 扩展为当前节点名称、图形名称、对象标签) .
为了能够从这个库中使用它们(例如用于标签),字符串中的反斜杠(大部分)按原样传递。
这意味着用户需要对文字反斜杠进行转义(加倍)。
由于反斜杠在 Python string文字中也很特殊,因此需要第二级加倍。例如label=‘\\’,对于呈现为单个文字反冲的标签:.
要禁用字符串中的任何特殊字符含义(例如,从字面上呈现的用户输入),请使用graphviz.escape()函数(类似于re.escape()函数)
为了防止破坏内部引用机制,“作为反斜杠转义的引号的特殊含义自此0.14库的版本以来已被禁用。
例如,两者label='”‘和label=’\“’ 现在都产生相同的 DOT 源[label=”“”] (呈现为文字引用的标签)。

unflatten()提高具有许多叶子或断开节点的图的纵横比。
dot2 = dot1.unflatten(stagger=3)

You can use the tempfile.mktemp() function from the stdlib tempfile module to render to a different file for each invocation调用.
This avoids needing to close the viewer查看器 window each time within such an incremental workflow增量工作流
(and also serves to preserves the intermediate steps并且还用于保留中间步骤).

API Reference

‘’’
graphviz.Graph
Graph source code in the DOT language.

graphviz.Digraph
Directed graph source code in the DOT language.

graphviz.Source
Verbatim DOT source code string to be rendered by Graphviz.

verbatim adj./adv.逐字的(地); 一字不差的(地);

#[例句]It was nothing but a verbatim translation. 这只不过是逐字的直译罢了。

gr

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值