解决Graphviz中文乱码问题

问题描述:

使用Graphviz绘制中文依存句法分析树的时候发现输出的中文结点乱码,不能正常显示中文,如下图所示:

解决Graphviz中文乱码问题_第1张图片

分析:

Graphviz 绘图时所使用的语言叫作"dot"。使用dot 语言,第一步就是决定要画哪种图。图分两种:有向图与无向图。

有向图以digraph声明图片,节点间的关系写为"->"; 无向图以graph 声明图片,节点间的关系可以写为"--"。

画图时需要对图片做一些特别的处理,例如加粗、把图变色等。我们要控制这些东西,就需要用到属性。

属性有四种:

  1. 用在节点上(Node, N) ; 
  2. 用在线段上(Edge, E);   
  3. 用在根图片上(Graph, G);   
  4. 用在子图片上(Cluster subgraph, C)

对于节点(node) 的属性,有以下几种指定法:

  • 节点名[节点属性名=值];
  • 节点名[节点属性名=值,节点属性名=值];
  • node [节点属性名=值,节点属性名=值];

属性指定的语句必须要被中括号括起。当一次指定多值时,需用英文逗点隔开。第三行中的node 是个关键字,用来代称「图片范围内」所有「还没创建」的节点,或者您也可将它理解为:在当前大括号的范围内,所有尚未创建节点的属性预设值,会被这个语句给变更。

对于线段(edge)的属性指定,与上述节点属性指定方式很类似:

  •  节点名->节点名[线段属性名=值];
  •  节点名--节点名[线段属性名=值,线段属性名=值];
  • edge [线段属性名=值,线段属性名=值]; 其中edge 是关键字。

可见以下两个例子pic2.dot和pic1.dot。其中pic1.dot描述了一个无向图,即用不带箭头的直线表示节点之间的联系的图;pic2.dot描述了一个有向图,有向图不仅能表示节点之间的联系,而且能用箭头表示节点之间流动的方向。它的线段(edge)的属性有style和color,属性值分别是filled和blue。

digraph pic2 { 
  a -> b
  a -> b
  b -> a [style=filled color=blue]

                          

graph pic1 { 
  a -- b
  a -- b
  b -- a [color=blue]

                   
 

解决方法:

graphviz默认设置下是不支持中文,如果在dot文件中直接写中文,会显示成乱码,要解决这个问题要做两件事,

1、把源文件保存为UTF-8的格式
2、设置fontname,也就是在node属性里添加fontname一项。例如下图标记处fontname="FangSong"表示结点中字体用仿宋体。

解决Graphviz中文乱码问题_第2张图片

验证执行结果:

解决Graphviz中文乱码问题_第3张图片

附:Windows系统中文字体的英文名

  • 新細明體:PMingLiU
  • 細明體:MingLiU
  • 標楷體:DFKai-SB
  • 黑体:SimHei
  • 宋体:SimSun
  • 新宋体:NSimSun
  • 仿宋:FangSong
  • 楷体:KaiTi
  • 仿宋_GB2312:FangSong_GB2312
  • 楷体_GB2312:KaiTi_GB2312
  • 微軟正黑體:Microsoft JhengHei
  • 微软雅黑体:Microsoft YaHei

 

 

 

 

参考文献:

1. http://blog.chinaunix.net/uid-24118190-id-3852456.html

2. https://www.cnblogs.com/luhouxiang/p/6193222.html

3. https://blog.csdn.net/xiajian2010/article/details/23748557

你可能感兴趣的:(NLP,python,Graphviz,python)