python graphviz的使用(画图工具)
阅读原文时间:2023年07月10日阅读:2

参考文章1

参考文章2

一、graphviz安装及配置

graphviz实际上是一个绘图工具,可以根据dot脚本画出树形图等。

1、windows安装

  1. 安装graphviz软件:https://graphviz.gitlab.io/_pages/Download/Download_windows.html
  2. 配置环境变量:把bin文件夹的路径加入到环境变量path里
  3. 安装python的graphviz模块:pip install graphviz

2、linux centos7安装

  1. yum下载graphviz软件:yum -y install graphviz
  2. 安装python的graphviz模块:pip install graphviz
  3. 测试:which dot

二、graphviz的使用

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

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)

使用node()和edge()或edges()方法将节点和边添加到图形对象:

  • Digraph():实例化一个图形对象
  • node():方法第一个参数是name,第二个参数是label,即node画节点
  • edges():方法可以一次添加多个边, 每个边用字符串表示, 比如 cb 表示从 c 到 b 的边,即edges画边
  • edge():方法一次添加一个边
  • view():把图形画出来,并自动显示图片(弹出来),一般使用view()进行调试
  • render():把图形画出来,一般使用render保存图片的时候,view=False(不弹出图片)

调试推荐使用 view()

保存图片推荐使用 render(view=False)

2、字体乱码

中文的label默认是无法正确显示在图中的, 因为默认的字体并不支持中文, 需要我们为node设置字体。

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

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

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

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

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

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

5、字体样式黑体:SimHei

6、字体样式宋体:SimSun

7、字体样式新宋体:NSimSun

8、字体样式仿宋:FangSong

9、字体样式楷体: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

字体样式

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")

3、无向图

用法跟有向图一样

from graphviz import Graph

无向图

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

dot.node("People")
dot.node("Home")
dot.edge("People", "Home")
dot.view(filename="MyPicture")

三、属性(样式)说明

node节点属性如下

Name

Default

Values

color

black

node shape color

comment

 

any string (format-dependent)

distortion

0.0

node distortion for shape=polygon

fillcolor

lightgrey/black

node fill color

fixedsize

false

label text has no affect on node size

fontcolor

black

type face color

fontname

Times-Roman

font family

fontsize

14

point size of label

group

 

name of node’s group

height

.5

height in inches

label

node name

any string

layer

overlay range

all, id or id:id

orientation

0.0

node rotation angle

peripheries

shape-dependent

number of node boundaries

regular

false

force polygon to be regular

shape

ellipse

node shape; see Section 2.1 and Appendix E

shapefile

 

external EPSF or SVG custom shape file

sides

4

number of sides for shape=polygon

skew

0.0

skewing of node for shape=polygon

style

 

graphics options, e.g. bold, dotted, filled; cf. Section 2.3

URL

 

URL associated with node (format-dependent)

width

.75

width in inches

z

0.0

z coordinate for VRML output

edge边框属性

Name

Default

Values

arrowhead

normal

style of arrowhead at head end

arrowsize

1.0

scaling factor for arrowheads

arrowtail

normal

style of arrowhead at tail end

color

black

edge stroke color

comment

 

any string (format-dependent)

constraint

true

use edge to affect node ranking

decorate

 

if set, draws a line connecting labels with their edges

dir

forward

forward, back, both, or none

fontcolor

black

type face color

fontname

Times-Roman

font family

fontsize

14

point size of label

headlabel

 

label placed near head of edge

headport

 

n,ne,e,se,s,sw,w,nw

headURL

 

URL attached to head label if output format is ismap

label

 

edge label

labelangle

-25.0

angle in degrees which head or tail label is rotated off edge

labeldistance

1.0

scaling factor for distance of head or tail label from node

labelfloat

false

lessen constraints on edge label placement

labelfontcolor

black

type face color for head and tail labels

labelfontname

Times-Roman

font family for head and tail labels

labelfontsize

14

point size for head and tail labels

layer

overlay range

all, id or id:id

lhead

 

name of cluster to use as head of edge

ltail

 

name of cluster to use as tail of edge

minlen

1

minimum rank distance between head and tail

samehead

 

tag for head node; edge heads with the same tag are

sametail

 

merged onto the same port

style

 

tag for tail node; edge tails with the same tag are merged onto the same port

taillabel

 

graphics options, e.g. bold, dotted, filled; cf. Section 2.3

tailport

 

label placed near tail of edge n,ne,e,se,s,sw,w,nw

tailURL

 

URL attached to tail label if output format is ismap

weight

1

integer cost of stretching an edge

Digraph图属性如下

Name

Default

Values

bgcolor

 

background color for drawing, plus initial fill color

center

false

center drawing on page

clusterrank

local

may be global or none

color

black

for clusters, outline color, and fill color if fillcolor not defined

comment

 

any string (format-dependent)

compound

false

allow edges between clusters

concentrate

false

enables edge concentrators

fillcolor

black

cluster fill color

fontcolor

black

type face color

fontname

Times-Roman

font family

fontpath

 

list of directories to search for fonts

fontsize

14

point size of label

label

 

any string

labeljust

centered

”l” and ”r” for left- and right-justified cluster labels, respectively

labelloc

top

”t” and ”b” for top- and bottom-justified cluster labels, respectively

layers

 

id🆔id…

margin

.5

margin included in page, inches

mclimit

1.0

scale factor for mincross iterations

nodesep

.25

separation between nodes, in inches.

nslimit

 

if set to f, bounds network simplex iterations by (f)(number of nodes) when setting x-coordinates

nslimit1

 

if set to f, bounds network simplex iterations by (f)(number of nodes) when ranking nodes

ordering

 

if out out edge order is preserved

orientation

portrait

if rotate is not used and the value is landscape, use landscape orientation

page

 

unit of pagination, e.g. “8.5,11”

pagedir

BL

traversal order of pages

quantum

 

if quantum ¿ 0.0, node label dimensions will be rounded to integral multiples of quantum

rank

 

same, min, max, source or sink

rankdir

TB

LR (left to right) or TB (top to bottom)

ranksep

.75

separation between ranks, in inches.

ratio

 

approximate aspect ratio desired, fill or auto

remincross

 

if true and there are multiple clusters, re-run crossing minimization

rotate

 

If 90, set orientation to landscape

samplepoints

8

number of points used to represent ellipses and circles on output (cf. Appendix C

searchsize

30

maximum edges with negative cut values to check when looking for a minimum one during network simplex

size

 

maximum drawing size, in inches

style

 

graphics options, e.g. filled for clusters

URL

 

URL associated with graph (format-dependent)

例子

"""使用graph_attr, node_attr, edge_attr参数, 你可以更改图中节点和边的显示样式"""

from graphviz import Digraph

可以在实例化对象的时候设置样式

dot = Digraph(name="MyPicture", node_attr={"shape": "plaintext"}, format="png")

也可以实例化之后, 设置这些样式

dot.graph_attr['rankdir'] = 'LR'
dot.edge_attr.update(arrowhead='vee', arrowsize='2')

然后开始画图

dot.node("Dog")
dot.node("Cat")
dot.edge("Dog", "Cat")

dot.view(filename="MyPicture")

四、官网

官方文档

官网

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章