12FF5B8

hico_horiuchiの技術系な覚え書き.

ファイルをまとめてgnuplotするRubyスクリプト

研究関連で「数値が1行ずつ記述されたテキストファイル」をまとめてグラフ化したかったので、Rubyからgnuplotを使って実現してみた。

準備

Ubuntu環境なので、aptitudeでgnuplotを入れる。
(x11環境も使いたい場合はgnuplot-x11を入れる。このままだとgnuplot-noxが入る。)

$ sudo aptitude install gnuplot

また、Rubyからgnuplotを使うためのgemを入れる。

$ sudo gem install gnuplot

スクリプト

hico-horiuchi/line_plot.rb · GitHub

require 'gnuplot'

Gnuplot.open do |gp|
  Gnuplot::Plot.new(gp) do |plot|
    plot.term "postscript 16 color"
    plot.output ARGV.first + ".eps"
    plot.title ARGV.shift
    plot.xlabel ARGV.shift
    plot.ylabel ARGV.shift

    ARGV.each do |file|
      y = []
      File.open(file).each_line do |line|
        y << line.to_f
      end
      x = (0..y.size - 1).collect {|v| v.to_i}
      plot.data << Gnuplot::DataSet.new([x, y]) do |ds|
        ds.with = "lines"
        ds.linewidth = 4
        ds.title = file
      end
    end

    plot.grid
  end
end

コマンドラインで指定したタイトルなどのオプションをshiftして、残りをファイルとして順に読み込む。
ファイルの内容を1行ずつ実数として配列に格納して、Yの値とする。
Xの値は、ファイルの行数(Yのデータ個数)に合わせて、0から順番に整数で振る。

使い方

以下のようなファイルを複数指定して、まとめてグラフ化する。

0.005
0.003
0.007
...

例えば、000.csv, 100.csv, 200.csv, 300.csvをグラフ化する。
タイトルはprocess_usage、X軸はcount、Y軸はusageとする。

$ ./line_plot.rb process_usage count usage 000.csv 100.csv 200.csv 300.csv

結果、以下のようなprocess_usage.eps(グラフのタイトル.eps)が作成される。
f:id:hico_horiuchi:20131113012819p:plain

まとめ

とりあえず、やりたかったことは出来た。
gnuplot自体初めてだったが、Rubyからだと楽に使えそう。
今後、必要があれば、点のプロットやグリッドの有無を指定できるようにしたい。