@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

= org-babelでかっちょえーグラフ描こうぜ!(えっと,gruffが使えるようになるまでの流れ)

[2010-09-08 18:31:00]
>>>[ruby]
>>>[gruff]
>>>[org]

ようやくうごきました.

こんなグラフを,org-babelのRとか,RubyからつくれたらRのグラフよりもカッチョいいよね*1

結論

Gentoo/Prefixで挑戦したら沼にはまります

手順

概略(http://rmagick.rubyforge.org/install-osx.htmlを参考に)

  • MacPortsImageMagick(リンク先のStep2),rb-rmagickをいれる.
  • MacPortsで入れたgemでrmagick(リンク先のStep3),gruffをいれる.

以上

ようするにMacPortsでrb-rmagickを入れたらよかったというわけですね.

ちなみにrb-rmagickは,直前の記事の内容をちょいちょいやってやる必要があります

というわけでorg-babelから美しいグラフをば拝まん

#+begin_src ruby :file my_fruity_graph.png :width 400 :height 400
  #!/opt/local/bin/ruby
  
  require 'rubygems'
  require 'gruff'
  
  g = Gruff::Line.new
  g.title = "My Graph" 
  
  g.data("Apples", [1, 2, 3, 4, 4, 3])
  g.data("Oranges", [4, 8, 7, 9, 8, 9])
  g.data("Watermelon", [2, 3, 1, 5, 6, 8])
  g.data("Peaches", [9, 9, 10, 8, 7, 9])
  
  g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
  
  g.write('my_fruity_graph.png')
#+end_src

#+results:
[[file:my_fruity_graph.png]]

ソースコードのところでC-cC-cすると下にresults:画像のリンクができます.リンクの上でC-cC-oすると,そのリンクにジャンプして,画像を開いてくれます.

これが最初のグラフの画像でした.

org-babelらしく表からデータ持ってきて.っていうのが,Rubyでの配列とかどうやって使うのかわからんくてつかえない...

org-babel上の表からデータを持ってきて,gruffでグラフを描画

上と同じデータをorg-babelっぽく使ってみましょう

** gruffのテスト

#+TBLNAME: fruits
|            | 2003 |   | 2004 |   | 2005 |   |
| Apples     |    1 | 2 |    3 | 4 |    4 | 3 |
| Oranges    |    4 | 8 |    7 | 9 |    8 | 9 |
| Watermelon |    2 | 3 |    1 | 5 |    6 | 8 |
| Peaches    |    9 | 9 |   10 | 8 |    7 | 9 |

このグラフをgruffで描く

#+SOURCE: test2(frtable = fruits)
#+begin_src ruby :file my_fruity_graph.png :width 400 :height 400
  #!/opt/local/bin/ruby
  
  require 'rubygems'
  require 'gruff'
  
  g = Gruff::Line.new
  g.title = "My Graph"
  
  for dat in frtable[1..-1] do
    g.data(dat[0], dat[1..-1])
  end
  
  g.labels = {0 => "#{frtable[0][1]}", 2 => "#{frtable[0][3]}", 4 => "#{frtable[0][5]}" }
  
  g.write('my_fruity_graph.png')
#+end_src

#+results: test2
[[file:my_fruity_graph.png]]

こんな感じに#+SOURCE: のところに,frtable=fruitって書いとくと,rubyでの変数frtableに#+TABLE: fruitの表のデータが二次元配列として代入された状態でRubyが実行されます.

frtable[行][列]

てわけで,g.dataの引数に,1列目のラベルと,残りのデータを引数に渡してます.

g.labelの引数の渡し方がもうちょっとうまく渡せそうな気がするんやけど,まだ知識不足です.

ま,それなりに便利になりそうですね.

*1:なんて考えた私が馬鹿でした