Skip to content
3月 14 / rakkyoo

rubyで複数のグラフを作成〜ruby ‘gnuplot’のmultiplotを使う(subplotみたいに)

手持ちのデータを一気にグラフ化したいなって思ったときに,octaveでもいいのですが,rubyを使ってできないかなと模索中です.
とりあえず,一つのウィンドウに複数のグラフをプロットしたい時はどうするのかなと思ったので,備忘録です.

複数のプロットを一つのグラフ内に表示する場合は,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# -*- coding: utf-8 -*-
 require "gnuplot"
 
Gnuplot.open do |gp|
	Gnuplot::Plot.new( gp ) do |plot|
		plot.term "postscript 16 color" #=> postscript 出力でフォントを18に
		plot.output "out.eps" #=> out.ps に出力する
		plot.title  'plot'
		plot.ylabel 'ylabel'
		plot.xlabel 'xlabel'
 
		x = (-100..100).collect {|v| v.to_f+50}
		y = (-100..100).collect {|v| v.to_f ** 2}
		plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
			ds.with = "lines"
			ds.notitle
			ds.linewidth = 4 #=> ラインの太さを太く
		end
		x = (-100..100).collect {|v| v.to_f+100}
		y = (-100..100).collect {|v| v.to_f ** 2}
		plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
			ds.with = "lines"
			ds.notitle
			ds.linewidth = 4 #=> ラインの太さを太く
		end
		plot.grid
	end
end

Out pdf 1 ページ

1
2
3
4
5
6
7
8
9
10
11
12
		plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
			ds.with = "lines"
			ds.notitle
			ds.linewidth = 4 #=> ラインの太さを太く
		end
		x = (-100..100).collect {|v| v.to_f+100}
		y = (-100..100).collect {|v| v.to_f ** 2}
		plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
			ds.with = "lines"
			ds.notitle
			ds.linewidth = 4 #=> ラインの太さを太く
		end

こんな感じに二つ「plot.data << ・・・」とデータを入れればいいだけ. ちなみに,最初に以下のように書くと,epsファイルで出力してくれます.

1
2
plot.term "postscript 16 color" #=> postscript 出力でフォントを18に
plot.output "out.eps" #=> out.ps に出力する

term に「postscript」を指定して,フォントを「16」で「カラー」で出力っという意味です.この辺は,gnuplotの設定の書き方そのままです.

サイズや位置を変える場合は,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# -*- coding: utf-8 -*-
 require "gnuplot"
 
Gnuplot.open do |gp|
	Gnuplot::Plot.new( gp ) do |plot|
		plot.term "postscript 16 color" #=> postscript 出力でフォントを18に
		plot.output "out.eps" #=> out.ps に出力する
		plot.title  'plot'
		plot.ylabel 'ylabel'
		plot.xlabel 'xlabel'
		plot.size "1,0.4" #=> plotのサイズを決める
		plot.origin "0.0,0.0" #=> plot の原点位置
		plot.bmargin "0" #=> 下のマージンをなくす
 
		x = (-100..100).collect {|v| v.to_f+50}
		y = (-100..100).collect {|v| v.to_f ** 2}
		plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
			ds.with = "lines"
			ds.notitle
			ds.linewidth = 4 #=> ラインの太さを太く
		end
		x = (-100..100).collect {|v| v.to_f+100}
		y = (-100..100).collect {|v| v.to_f ** 2}
		plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
			ds.with = "lines"
			ds.notitle
			ds.linewidth = 4 #=> ラインの太さを太く
		end
		plot.grid
	end
end

Out pdf 1 ページ 1
こんな感じで,plotのサイズや位置も移動できます.

1
2
3
plot.size "1,0.4" #=> plotのサイズを決める
plot.origin "0.0,0.0" #=> plot の原点位置
plot.bmargin "0" #=> 下のマージンをなくす

こんな感じに設定です.

次に,matlabのsubplotみたいに,一つのウィンドウ上に複数のグラフを書きたいときは,multiplotを使います.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# -*- coding: utf-8 -*-
 require "gnuplot"
 
Gnuplot.open do |gp|
	Gnuplot::Plot.new( gp ) do |plot|
		plot.term "postscript 18 color" #=> postscript 出力でフォントを18に
		plot.output "out.eps" #=> out.ps に出力する
		plot.multiplot #=> マルチプロット
		plot.title  'subplot-1'
		plot.ylabel 'ylabel'
		plot.xlabel 'xlabel'
		plot.size "1,0.4" #=> plotのサイズを決める
		plot.origin "0.0,0.0" #=> plot の原点位置
		plot.bmargin "0" #=> 下のマージンをなくす
		plot.tmargin "1"
 
		x = (-100..100).collect {|v| v.to_f+50}
		y = (-100..100).collect {|v| v.to_f ** 2}
		plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
			ds.with = "lines"
			ds.notitle
			ds.linewidth = 4 #=> ラインの太さを太く
		end
		plot.grid
	end
 
	Gnuplot::Plot.new( gp ) do |plot|
		plot.multiplot
		plot.title  'subplot-2'
		plot.ylabel 'ylabel'
		plot.xlabel 'xlabel'
		plot.size "1,0.4"
		plot.origin "0.0,0.5"
		plot.bmargin "1"
		plot.tmargin "0" #=> 上のマージンをなくす
 
		x = (-100..100).collect {|v| v.to_f+100}
		y = (-100..100).collect {|v| v.to_f ** 2}
		plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
			ds.with = "lines"
			ds.notitle
			ds.linewidth = 4 #=> ラインの太さを太く
		end
	end
end

こんな感じで書くと,
Out pdf 1 ページ 2
一つのウィンドウに複数のグラフを書くことができます.

1
		plot.multiplot

っと設定するだけです.
下に出すグラフの位置と大きさを

1
2
		plot.size "1,0.4" #=> plotのサイズを決める
		plot.origin "0.0,0.0" #=> plot の原点位置

と設定してます.原点が[0.0, 0.0]です.
上に出すグラフの位置と大きさを

1
2
		plot.size "1,0.4"
		plot.origin "0.0,0.5"

と設定しています.原点が[0.0, 0.5]です.
グラフのY軸方向の大きさを0.4に設定しているので,Y方向に0.5だけずらしています.

この例では,epsファイルに出力する様になっているので,しっかりと「out.pes」ができます.

手持ちのデータをグラフ化したいときは,これくらで一通りは作業できます♪

rubyのgnuplot便利です♪

[`twib` not found]

Leave a comment

CAPTCHA


This blog is kept spam free by WP-SpamFree.