python调用graphviz中文乱码_Python-Graphviz

一、graphviz安装及配置

二、graphviz的使用

graphviz 有两种图,一种是无向图 graph ,边用 -- 连接;一种是有向图 digraph ,边用 -> 连接

官网API说明

1、初步认识

from graphviz import Digraph

# 实例化一个Digraph对象(有向图),name:生成的图片的图片名,format:生成的图片格式

dot = Digraph(name="MyPicture", comment="the test", format="png")

# 生成图片节点,name:这个节点对象的名称,label:节点名,color:画节点的线的颜色

dot.node(name='a', label='Ming', color='green')

dot.node(name='b', label='Hong', color='yellow')

dot.node(name='c', label='Dong')

# 在节点之间画线,label:线上显示的文本,color:线的颜色

dot.edge('a', 'b', label="ab\na-b", color='red')

# 一次性画多条线,c到b的线,a到c的线

dot.edges(['cb', 'ac'])

# 打印生成的源代码

print(dot.source)

# 画图,filename:图片的名称,若无filename,则使用Digraph对象的name,默认会有gv后缀

# directory:图片保存的路径,默认是在当前路径下保存

dot.view(filename="mypicture", directory="D:\MyTest")

# 跟view一样的用法(render跟view选择一个即可),一般用render生成图片,不使用view=True,view=True用在调试的时候

dot.render(filename='MyPicture', directory="D:\MyTest",view=True)

(1) 两种图

from graphviz import Digraph, Graph

dot = Digraph()

dot = Graph()

(2) 格式

from graphviz import Digraph, Graph

dot = Digraph(format='png')

dot.format = 'svg'

(3) 输出

from graphviz import Digraph, Graph

dot = Digraph(format='png')

# 画图,filename:图片的名称,若无filename,则使用Digraph对象的name,默认会有gv后缀

# directory:图片保存的路径,默认是在当前路径下保存

# view(filename=None, directory=None, cleanup=False, quiet=False, quiet_view=False)

dot.view(filename="mypicture", directory="D:\MyTest")

# 跟view一样的用法(render跟view选择一个即可),一般用render生成图片,不使用view=True,view=True用在调试的时候

# render(filename=None, directory=None, view=False, cleanup=False,

# format=None, renderer=None, formatter=None, quiet=False, quiet_view=False)

dot.render('test-output/holy-grenade.gv', view=True)

# pipe(format=None, renderer=None, formatter=None, quiet=False)

print(dot.pipe().decode('utf-8'))

# 保存源文件

# save(filename=None, directory=None)

dot.save()

(4) 输入

from graphviz import Source

src = Source('digraph "the holy hand grenade" { rankdir=LR; 1 -> 2 -> 3 -> lob }')

# from_file(filename, directory=None, format=None, engine=None, encoding='utf-8')

src = Source.from_file(file_name)

(5) 属性设置

graphviz.Digraph(name=None, comment=None, filename=None, directory=None, format=None, engine=None, encoding='utf-8',

graph_attr=None, node_attr=None, edge_attr=None,

body=None, strict=False)

graphviz.Digraph.attr(kw=None, _attributes=None, **attrs)

kw – Attributes target (None or 'graph', 'node', 'edge')

graphviz.Digraph.edge_attr , graphviz.Digraph.node_attr , graphviz.Digraph.graph_attr

from graphviz import Digraph

dot = Digraph()

dot.edge_attr

dot.node_attr

dot.graph_attr

2、特殊技能

(1)引用和类似HTML的标签

如果字符串以开头'',则按原样传递而不用引号/转义:尖括号之间的内容被引擎视为特殊的HTML字符串,可用于类似HTML的标签:

from graphviz import Graph

h = Graph('html_table')

h.node('tab', label='''<

left right
>''')

对于应以字面开头'',请使用nohtml()函数禁用斜括号的特殊含义,并应用常规的引号/转义符

from graphviz import nohtml, Digraph

d = Digraph(format='svg')

d.node('diamond', label=nohtml('<>'))

print(d.source)

(2)子图和类

Graph和Digraph对象有一个 subgraph()增加一个子图实例-方法。

有两种使用方式:要么使用与唯一参数相同类型的现成图形对象(其内容作为子图添加),要么忽略该graph参数(返回上下文管理器以在其中更优雅地定义子图内容)一with嵌段)。

第一个用法选项,带有graph作为唯一参数:

p = Graph(name='parent')

p.edge('spam', 'eggs')

c = Graph(name='child', node_attr={'shape': 'box'})

c.edge('foo', 'bar')

p.subgraph(c)

第二次使用,带有with-block(忽略graph参数):

p = Graph(name='parent')

p.edge('spam', 'eggs')

with p.subgraph(name='child', node_attr={'shape': 'box'}) as c:

c.edge('foo', 'bar')

(3) 链接到cluster的图中

compound: bool,默认值:false

如果为true,则在群集之间允许使用edge链接。

与lhead及ltail同时使用

(4) 结构体

digraph structs {

node [shape=record];

struct1 [label=" left| mid\ dle| right"];

struct2 [label=" one| two"];

struct3 [label="hello\nworld |{ b |{c| d|e}| f}| g | h"];

struct1:f1 -> struct2:f0;

struct1:f2 -> struct3:here;

}

(5) HTML标签

shape=plain

字体标记为粗体,斜体,下划线,下标和上标()

label:text

|fonttable

text:textitem

|text textitem

textitem:string

|

| text

| text

| text

| text

| text

| text

| text

| text

fonttable:table

| table

| table

| table

| table

| table

table:

rows:row

|rows row

|rows


row

row:

cells

cells:cell

|cells cell

|cells cell

cell:

label

|

digraph structs {

node [shape=plaintext]

struct1 [label=<

left mid dle right
>];

struct2 [label=<

one two
>];

struct3 [label=<

hello
world
b g h
c d e
f
>];

struct1:f1 -> struct2:f0;

struct1:f2 -> struct3:here;

}

(6) 字体乱码

from graphviz import Digraph

dot = Digraph(name="MyPicture", format="png")

dot.node(name="A", label="老师", fontname="Microsoft YaHei")

dot.node('B', '学生', fontname="Microsoft YaHei")

dot.edge("A", "B", label="教学", fontname="Microsoft YaHei")

dot.render(filename="MyPicture")

# 有些字体是需要下载的,默认使用Microsoft YaHei就好

00、字体样式微软雅黑:Microsoft YaHei

01、字体样式华文黑体:STHeiti

02、字体样式华文楷体:STKaiti

03、字体样式华文宋体:STSong

04、字体样式华文仿宋:STFangsong

05、字体样式黑体:SimHei

06、字体样式宋体:SimSun

07、字体样式新宋体:NSimSun

08、字体样式仿宋:FangSong

09、字体样式楷体:KaiTi

10、字体样式仿宋_GB2312:FangSong_GB2312

11、字体样式楷体_GB2312:KaiTi_GB2312

12、字体样式微软正黑体:Microsoft JhengHei

13、字体样式微软雅黑体:Microsoft YaHei

14、字体样式隶书:LiSu

15、字体样式幼圆:YouYuan

16、字体样式华文细黑:STXihei

17、字体样式华文楷体:STKaiti

18、字体样式华文宋体:STSong

19、字体样式华文中宋:STZhongsong

20、字体样式华文仿宋:STFangsong

21、字体样式方正舒体:FZShuTi

22、字体样式方正姚体:FZYaoti

23、字体样式华文彩云:STCaiyun

24、字体样式华文琥珀:STHupo

25、字体样式华文隶书:STLiti

26、字体样式华文行楷:STXingkai

27、字体样式华文新魏:STXinwei

3、文档链接

错误处理

1. 不能识别格式

CalledProcessError: Command '['dot', '-Tsvg', '-O', 'MyPicture.gv']'

returned non-zero exit status 1.

[stderr: b'Format: "svg" not recognized. Use one of:\r\n']

直接使用如下几步, 打开cmd(在管理员权限下)

dot -v

dot -c

dot -v

附录:参考资料

(c) 著作权归作者所有

你可能感兴趣的:(python调用graphviz中文乱码_Python-Graphviz)