Ruby で gnuplot を使い関数グラフを描く

Python の pylab で簡単に関数グラフが描けたので(参照)、Ruby でも出来ないかとぐぐってみたところ、なかなか簡単なやつがありました。Linux で使える Gnuplot というツールのラッパーGem があったので使ってみます(ソースコード)。すでにここにとてもいい記事があったので、そのとおりにやるだけです。

Gnuplot

まず、LinuxGnuplot を入れます。やり方は上のブログの別記事を見れば簡単にわかります。Linux Mint 17.2 で確認しました。

一応書いておくと、$ sudo apt-get install gnuplot-x11 でお終いです。インストールの確認は、$ gnuplot で対話型インターフェイスが立ち上がれば OK です。そこで gnuplot> test でテスト描画されることを確認して下さい。
www.gnuplot-cmd.com


Rubygnuplot Gem

これもインストールは、上のブログ記事(参照)を参考にして下さい。gem install gnuplot で出来るということです。僕の場合は bundler を使っているので、そこからでも OK でした。

サンプルコード。pylab の場合と同じグラフを描いてみます。

require 'bundler/setup'
require 'gnuplot'

Gnuplot.open do |gp|
  Gnuplot::Plot.new(gp) do |plot|
    plot.xrange "[-3:3]"
    f = "x ** 4 + 2 * 5 ** 3 - 10 * x ** 2 + 5 * x  + 4"
    plot.data << Gnuplot::DataSet.new(f)
  end
  gets
end

結果はこんな感じです。


Ruby の場合でも結構簡単ですね。

しかし Ruby 好きが思うには、科学技術のツールとして RubyPython に追いつく日はたぶん来ないような気がする。僕程度の初心者でも、ツールとしての Python はあまりにも便利そうに見える。実際世界的に Python を使う人がすごく多いから、これからさらに Python のライブラリは充実し、よたよたしながら Ruby は離されていくのではないか。RubyGUI 標準の Ruby/Tk ですら、公式ドキュメントが用意されていない。Ruby/Tk はますます使われなくなっていくだろうと思う。
(※追記 初心者がバカなことを書いたな。頑張っておられるコミュニティの方々に失礼だ。4/13)

画像出力

グラフを画像ファイルに落とすことができます。ここを参考にしました。

require 'bundler/setup'
require 'gnuplot'

Gnuplot.open do |gp|
  Gnuplot::Plot.new(gp) do |plot|
    plot.terminal "png"
    plot.output   "gnuplot_sample.png"
    plot.xrange   "[-3:3]"
    f = "sin(x)"
    plot.data << Gnuplot::DataSet.new(f)
  end
  gets
end

結果。

3次元

ここからのコピペです。すごいなあ。

require 'bundler/setup'
require 'gnuplot'

Gnuplot.open do |gp|
  Gnuplot::SPlot.new(gp) do |plot|
    plot.set "isosamples 50,50"
    plot.set "pm3d at b"
    plot.data << Gnuplot::DataSet.new("sin(sqrt(x*x+y*y))/sqrt(x*x+y*y)")
  end
  gets
end



※参考
rubyからgnuplotを使って,データをプロット | rakkyooの備忘録
MF / Ruby で Gnuplot


※注記
Gem は上で紹介した 'gnuplot' よりも、新しく出た 'numo/gnuplot' の方が遥かに使いやすいです。以下のリンク先を参照。(12/23)
MF / 【Ruby】numo-gnuplotで遊ぶ
gnuplot で陰関数の表示(Ruby) - Camera Obscura