Help us understand the problem. What is going on with this article?

Graph::Easyの使い方

More than 5 years have passed since last update.

syuiさんのコマンドラインからフローチャートや図を描く方法を読んで使いたくなったので、必要最低限の使い方を調べてみた。

Graph::EasyはCPANというPerlアーカイブにあるモジュールですが、cpan自体はMacに入っているようなのでいきなりcpan Graph::Easyでインストール完了。

左から右、一般的なフロー図

まずは超基本。コマンド名はgraph-easy。コマンドライン入力は''で括ったパラメータを<<<で流し込む。

下のようなハコ図を書きたい場合、ハコの中に表示したい文字列を[]で囲んで->で結ぶだけ。

MBP2011:~ $ graph-easy <<< '[a]->[b]'
+---+     +---+
| a | --> | b |
+---+     +---+

もっと続けたければ増やすだけ。超簡単!

MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[d]->[e]'
+---+     +---+     +---+     +---+     +---+
| a | --> | b | --> | c | --> | d | --> | e |
+---+     +---+     +---+     +---+     +---+

分岐させてみよう

上のaからeまで一直線に並んでいたのを、bでcとd->eの2系統に分岐させてみます。

一旦abcを->で結んだら、分岐開始点のbから改めてdeを->で結べばOK。Graph::Easyは同じ名前のハコを一つのものと認識します。

MBP2011:~ $ graph-easy <<< '[a]->[b]->[c][b]->[d]->[e]'
+---+     +---+     +---+     +---+
| a | --> | b | --> | d | --> | e |
+---+     +---+     +---+     +---+
            |
            |
            v
          +---+
          | c |
          +---+

ここでうっかりcとbの間を->で結んじゃうとくるりとループして戻っちゃうので、分岐させたいラインは間違って結ばないこと。

MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[b]->[d]->[e]'

  +--------------+
  |              v
  |  +---+     +---+     +---+     +---+
  |  | a | --> | b | --> | d | --> | e |
  |  +---+     +---+     +---+     +---+
  |              |
  |              |
  |              v
  |            +---+
  +----------- | c |
               +---+

合流させてみる

てことはうまく合流点を指定すれば簡単にできるね。

MBP2011:~ $ graph-easy <<< '[a]->[b]->[c][d]->[e]->[b]'
+---+     +---+     +---+
| a | --> | b | --> | c |
+---+     +---+     +---+
            ^
            |
            |
+---+     +---+
| d | --> | e |
+---+     +---+

合流というか元に戻すこともできる。

MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[d]->[a]'

  +-----------------------------+
  v                             |
+---+     +---+     +---+     +---+
| a | --> | b | --> | c | --> | d |
+---+     +---+     +---+     +---+

記号に文字列を表示する

上の図、dからaにフィードバック掛かってるみたいだ。この矢印にFeedBackって表示したいなと思ったら、該当するコマンド(4つ目の->)に対して指示をする。

指示の仕方は{}で囲って繋げるだけ。表示する文字列のことをラベルと呼ぶので{label:"hoge";}とか指定する。

MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[d]->{label:"FeedBack";}[a]'
      FeedBack
  +-----------------------------+
  v                             |
+---+     +---+     +---+     +---+
| a | --> | b | --> | c | --> | d |
+---+     +---+     +---+     +---+

ラベルを付けられるのは矢印だけじゃない。てか指定間違えたらハコに文字列が入った。。。というわけで{}で指定したい属性は必ず指定すべき記号の後ろに書く。

MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[d]{label:"feedback";}->[a]'

  +-----------------------------+
  v                             |
+---+     +---+     +---+     +----------+
| a | --> | b | --> | c | --> | feedback |
+---+     +---+     +---+     +----------+

つまり今までハコをあらわす[]の中に入っていたのは変数名であって、ラベルが指定されていなかったために一時的に変数名が表示されていただけみたいだ。

ただまぁそういう振る舞いである以上、あえて[]に対して{label:}指定はしなくていいですけどね。

MBP2011:~ $ graph-easy <<< '[apple]->[banana]->[cherry]'
+-------+     +--------+     +--------+
| apple | --> | banana | --> | cherry |
+-------+     +--------+     +--------+

上から下へ、縦フロー図

実はこれがやりたかった。大抵ハコに表示する文字列は長いし、Webで使う分には縦フローのほうが扱いやすい。Graph::Easyを使おうと思ったのもQiitaにフローチャートを書きたかったから。

というわけでこれまで横書きで表示していたフロー図を縦書きにする指示は{flow:}属性。これを使ってgraph{flow:south;}と指定する。

MBP2011:~ $ graph-easy <<< 'graph{flow:south;}[apple]->[banana]->[cherry]'
+--------+
| apple  |
+--------+
  |
  |
  v
+--------+
| banana |
+--------+
  |
  |
  v
+--------+
| cherry |
+--------+

いきなり出てきたgraphってなんだ?とか何故south?とか思ってはいけない。そういうものだ。が、勘のいい人なら横フロー図を右から左へ流せるようになるはず。

パラメータをファイルで流し込む

そろそろ入力文字数が増えてきてtypoとか気になってくる頃。これまで''で括って指定していたパラメータをそのままファイルに記述して、これをGraph::Easyに渡すことができる。

MBP2011:~ $ cat graph.txt
graph{flow:west;}[apple]->[banana]->[cherry]
MBP2011:~ $ graph-easy graph.txt
+--------+     +--------+     +-------+
| cherry | <-- | banana | <-- | apple |
+--------+     +--------+     +-------+

このくらい知っていれば大抵事足りるんじゃないかと。

これ以上詳しいことは、Graph::Easyのマニュアル読んで。

Takeru
いま勤めてる会社にはWindowsしかないから、遊ぼうと思ったらPowerShellを覚えないといけない。。。
http://takeru-chan.github.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away