HYT MachineWorks

やったこととか思いついたことをメモしておくブログです。

networkxとpygraphvizを使って日本語を含むグラフを作画する(Python3, Windows7 64bit)

networkxとpygraphvizを使ってネットワークの作画

python向けのネットワーク解析パッケージであるnetworkxとその作画にgraphvizを用いる際のラッパーであるpygraphvizを組み合わせてグラフを作図してみました。その際に日本語を豆腐にしないで表示する方法のメモです

 networkxとpygraphvizのインストール

networkxはpipで

pip install networkx

pygraphvizは複雑なので、以前書いた記事を参照してください。

hytmachineworks.hatenablog.com


networkx と pygrahpvizを組み合わせた作図手順

 1.リストで表現されたエッジ(矢印の元と先)をすべて一つにしたリストで作る
 2.networkxの有指向グラフDiGraphを初期化
 3.1で作ったエッジのリストを読み込ませる
 4.pygraphvizのa_graphに変換
 5.日本語のフォントに対応させるためフォントを指定
 6.出来たグラフを書き出し

ってことをやったサンプルが↓の通りです。

# coding = utf-8

import networkx as nx

src_list = ["", "", "", "a", "", "", ""]
dst_list = ["a", "a", "a", "i", "i", "i", "i"]

all_edges = [[src, dst] for src, dst in zip(src_list, dst_list)]

g = nx.DiGraph()
g.add_edges_from(all_edges)

a_graph = nx.nx_agraph.to_agraph(g)

a_graph.node_attr.update(fontname="MS Gothic")
a_graph.layout("dot")
a_graph.draw("test.png")

で出来た結果が、

f:id:hytmachineworks:20171209102013p:plain

こんな感じ。

GraphVizで日本語を表示

いままでは、Windows7でMeiryoを使っていたので気にしてなかったんだけど今度はNotoSansCJK JPでやろうと思ったらドハマリした

でも結局Noto Sans CJK JPだけダメだった。Noto Serif CJK JPは大丈夫なのに。。。

認識のさせかたは、Pangoを利用したソフトなら共通で、別のソフトではあるがInkscapeの例を参考に設定した。

nahcew.com

  GraphViz本体のインストールフォルダ\fonts\conf.d

にある 51-local.confをテキストエディタで開いて

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/conf.avail/51-local.conf file to configure system font access -->
<fontconfig>
<!-- Load local system customization file -->
<include ignore_missing="yes">local.conf</include>
<dir>C:\Windows\Fonts\</dir>
</fontconfig>

赤字の<dir>C:\Windows\Fonts\</dir>を<fontconfig>に追加してください。
それで認識されるようになります。

認識されるフォントの指定方法は下記サイトを参考にした

cassa.at.webry.info

認識される文字列は、Pangoを利用したソフトで認識できる名前を指定する必要があって、例えばPangoを利用したソフトであるInkScapeで表示させると

f:id:hytmachineworks:20171209103523p:plain

こんな感じ出ててくる名前をそのまま指定してあげる感じになります。
Inkscapeでも見ようと思うと同じくInkscapeのfont.dの51-local.confを編集が必要になります。

まとめ

ほとんど、フォントの設定の話になってしまいましたが、参考までに。