GraphvizでSyntax diagramを描こうとしたけどうまくいかなかった

JGPのsyntax diagramみたいなのをGraphvizで描きたくて色々頑張ってみたんだけど、僕には無理だった。

railroad diagram

graph Heawood {
      node [label="\N", fontname=Arial, width="0.50000", height="0.500000", color=black];
      edge [color=black];
      graph [rankdir = LR];

      subgraph cluster1 {
               color=none

               Start [style=invis];
               L1 [style=invis, width=0.0, shape=point];
               Alpha [shape=box, label="アルファベット"];
               L2 [style=invis, width=0.0, shape=point];
           End [style=invis];

           Start -- L1 [arrowtail=teetee];
               L1    -- Alpha;
               Alpha -- L2;
               L2    -- End [arrowhead=teetee];

      }

      Digit [shape=box, label="   数字   "];
      Hif [shape=circle, label="-"];

      L1    -- Digit [tailport=w,headport=w];
      L1    -- Hif [tailport=w,headport=w];
      Digit -- L2 [tailport=e,headport=w];
      Hif   -- L2 [tailport=e,headport=w];
}

ProductName JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
Douglas Crockford
オライリージャパン / 1890円 ( 2008-12-22 )


参考

構文木をHaskell+Graphvizで

パーサーから直接書き出すようにしたいが、とりあえず。

import Data.Graph.Inductive
import Data.Graph.Inductive.Graphviz

labUEdges :: [Edge] -> [UEdge]
labUEdges = map (\(i,j) -> (i,j,()))

exprt :: Gr String ()
exprt = mkGraph (zip [1..5] ["2","*","3","+","4"]) 
(labUEdges [(2,1),(2,3),(4,2),(4,5)])

main = do putStrLn $ graphviz exprt "test" (0,0) (0,0) Portrait

コンパイルするには--makeオプションをつけて

$ ghc gvtest.hs --make
[1 of 1] Compiling Main             ( gvtest.hs, gvtest.o )
Linking gvtest ...
$ ./gvtest | dot -Tpng > gvtest.png; open gvtest.png

gvtest

pygraphviz

レイアウトをもう少しちゃんとしたい。

import pygraphviz as pgv
G=pgv.AGraph(strict=False,directed=True)
G.add_node('V1,C1')
G.add_node('V2,C2')
G.add_node('X1')
G.add_node('X2')
G.get_node('V2,C2').attr['shape'] = 'box'
G.get_node('V1,C1').attr['shape'] = 'box'
G.add_edge('V1,C1','V2,C2')
G.add_edge('V2,C2','V1,C1')
G.add_edge('V1,C1','X1')
G.add_edge('V1,C1','X2')
G.get_edge('V1,C1','V2,C2').attr['label'] = 'k12'
G.get_edge('V2,C2','V1,C1').attr['label'] = 'k21'
G.get_edge('V1,C1','X1').attr['label'] = 'Km,Vmax'
G.get_edge('V1,C1','X2').attr['label'] = 'K'
G.layout(prog='dot')
G.draw('pk1-3.png')

pk1-4

macbookにgraphviz,pygraphviz,networkxを入れた

コンパートメントモデルを書くのにいちいちInkspaceを立ち上げるのもめんどうなのでGraphvizにでも頼るかと思ったらmacbookには入ってなかった。networkxもついでに入れといた。

sudo port install graphviz
sudo easy_install-2.6 pygraphviz
sudo easy_install-2.6 networkx

使う

>>> import pygraphviz as pgv
>>> d={'1': {'2': None}, '2': {'1': None, '3': None}, '3': {'2': None}}
>>> A=pgv.AGraph(d)
>>> A.layout(prog='dot')
>>> A.draw('pyg.png')

test

複雑ネットワーク入門

特にsubgraphの探索とか勉強したいところなんだけど、軽く脱線気味に。グラフとかネットワークは勉強してて楽しいですのう。

ProductName 複雑ネットワーク入門
今野 紀雄,井手 勇介
講談社 / ¥ 2,520 ()
通常24時間以内に発送

半分くらいはグラフの基本的なことで、ゴルトン・ワトソン木、スモールワールド、スケールフリー、しきい値モデルをさらっと。

  • 序章でラムゼー数
  • クラスター係数
    • いわゆる自分の友人同士が友人である
  • 二部グラフ
    • グラフの頂点集合が互いに素な二つの集合に分かれていること
  • ケーリーの定理
    • n個の頂点からなる木の個数はn^(n-2)個
  • ランダムグラフのクラスター係数の期待値は本質的にはp
  • ゴルトン・ワトソン過程はマルコフ連鎖
  • スモールワールド性
    • 少ない平均頂点距離と、大きなクラスター係数のとき
  • NWモデル
    • 拡張されたサイクルと、ランダムグラフを重ね合わせたグラフ
  • しきい値モデル
    • 次数分布がベキ則に従うことがある。

本書には具体的な例はほとんどないので自分で探せということか。

GASTON

GASTONが分からなくてお悩み中。参考文献とかから読まないとやっぱダメな感じ。

TODO:ここから追いかける

そのながれで、最短経路の本も読んでおく

ProductName 最短経路の本
R. ブランデンベルク,P. グリッツマン
シュプリンガー・ジャパン株式会社 / ¥ 3,675 ()
通常24時間以内に発送

当分日本酒も無しだなぁ、ということで、昨日吞みきった高砂で当分は家吞み断ちだ。

1225542968

中国茶用の茶器出したら、U隊長に「珍しいねー(なんかあったの?)」なんて言われてしまった。