Graphvizがドローイングソフトになってしまった件について Gviz ver0.3.0リリースのお知らせ
(追記:2014-3-3) Gvizについてのまとめ頁を作りました。
GraphvizのRubyラッパーであるGvizというツールを作っておりまして。
それは、次のようなgraph.ru
というファイルを用意して、
route :main => [:init, :parse, :cleanup, :printf]
route :init => :make, :parse => :execute
route :execute => [:make, :compare, :printf]
save :sample
そのディレクトリでgviz build
コマンドを実行すると、DOTファイルが出来上がるという代物です。
% gviz build
% open sample.dot
ネットワーク図とかクラス図とか系統樹などを描くのに適しています。
ドローイング?
でも、もっとアーティスティックな図も描きたいよね、Graphvizで。
というわけで…。
Gvizをアップデート(ver 0.3.0)しまして、Drawライクなメソッド群を追加しました。
ここで言うDrawライクなメソッドというのは、ノードの形のメソッド名を持ちx, y座標を引数に取るメソッドのことです。
使い方
こんなふうに使います。
# graph.ru
line :a, from:[-100,0], to:[100,0]
line :b, from:[0,-100], to:[0,100]
circle :c
rect :d, x:50, y:50, fillcolor:"green", label:"Rect"
triangle :e, x:50, y:-50, fillcolor:"cyan"
diamond :f, x:-50, y:50, fillcolor:"magenta"
egg :g, x:-50, y:-50, fillcolor:"yellow", label:"Egg"
save :draw
各メソッドの第1引数にはユニークなIDを渡します。座標は図の中心点で、省略すると原点(0,0)となります。lineはfromを省略すると原点からの線分になります。これらのメソッドを使うとgraph layoutがneato
に自動で設定されます。
% gviz build
% open draw.dot
なお、saveメソッドの第2引数にはpngなどの出力フォーマットを指定できるのですが、これを使うと座標のスケールが変わってしまうので調整が必要になります。Graphvizビューワのexport機能を使ったほうがいいでしょう。
circleのサイズはr
属性で指定し、他の図形はwidth
とheight
属性で指定します。
nodes colorscheme:"blues8"
square :a, width:4, fillcolor:3
8.downto(1).each do |r|
circle r.to_id, x:-(r-8)*10, y:(r-8)*10, r:r/4.0, fillcolor:r
end
save :draw2
出力です。
Drawライクなメソッドにはplaintext, none以外のノードの全shapeが含まれます。Gviz::SHAPESで全shapeを取得できるので、全メソッドを使って図形を出力してみます。
require 'colorable'
cs = Colorable::Colorset.new
shapes = (Gviz::SHAPES - ['plaintext', 'none'])
r = 500
deg = 0.step(to:360, by:5)
shapes.each do |shape|
i = deg.next
x = r * Math.cos(i * Math::PI / 180.0)
y = r * Math.sin(i * Math::PI / 180.0)
c = cs.next
send shape, i.to_id, x:x, y:y, fillcolor:"#{c.hex}aa", label:shape
end
save :draw3
曲線
残念ながら曲線を描くcurveのようなメソッドはありません。
「おまっ、曲線も描けないでドローイングとか言ってんの?」って話です。
いやいや、僕らには数式があるじゃないですか〜。
geometry - Is this Batman equation for real? - Mathematics Stack Exchange
ね?
お前は何がしたいんだ、って感じですが。
(追記:2013-1-9) 関連記事を書きました。
blog comments powered by Disqus