Search code examples
pythondrawgraph-tool

graph-tool draw function cannot show Chinese text


I am using graph-tool and trying to draw graphs with node property of Chinese words. However, when I draw it using

# coding=utf-8
from graph_tool.all import *

# English string as vertex name
g = Graph(directed=False)
vprop_name = g.new_vertex_property("string")
eprop_name = g.new_edge_property("string")
g.vertex_properties["name"] = vprop_name
g.edge_properties["name"] = eprop_name

v1 = g.add_vertex()
v2 = g.add_vertex()
v3 = g.add_vertex()
e1 = g.add_edge(0, 1)
e2 = g.add_edge(0, 2)
vprop_name[v1] = "cat"
vprop_name[v2] = "dog"
vprop_name[v3] = "mouse"
eprop_name[e1] = "01"
eprop_name[e2] = "02"

graph_draw(g, vertex_text=g.vertex_properties["name"],
           vertex_color="blue",
           vertex_font_size=18,
           edge_text=g.edge_properties["name"],
           output_size=(300, 300),
           output="english.png")

# Chinese string as vertex name
g = Graph(directed=False)
vprop_name = g.new_vertex_property("string")
eprop_name = g.new_edge_property("string")
g.vertex_properties["name"] = vprop_name
g.edge_properties["name"] = eprop_name

v1 = g.add_vertex()
v2 = g.add_vertex()
v3 = g.add_vertex()
e1 = g.add_edge(0, 1)
e2 = g.add_edge(0, 2)
vprop_name[v1] = "猫"
vprop_name[v2] = "狗"
vprop_name[v3] = "老鼠"
eprop_name[e1] = "01"
eprop_name[e2] = "02"

graph_draw(g, vertex_text=g.vertex_properties["name"],
           vertex_color="blue",
           vertex_font_size=18,
           edge_text=g.edge_properties["name"],
           output_size=(300, 300),
           output="chinese.png")

when the "name" properties are Chinese texts, it cannot show any word. When the text is English, the figure is OK.

This is the "english.png": enter image description here

And this is the "chinese.png" result: enter image description here

So I am wondering how I can make it show Chinese texts using this function.


Solution

  • Graph-tool uses cairo to do font rendering, which is a bit primitive. This means you need to choose by hand a font that supports Chinese characters:

    graph_draw(g, vertex_text=g.vertex_properties["name"],
               vertex_color="blue",
               vertex_font_size=18,
               vertex_font_family="HAN NOM A",        # this font needs to be installed
               edge_text=g.edge_properties["name"],
               output="chinese.png")
    

    The above gives me:

    enter image description here