Ruby で rsruby を用いてグラフ作成
- CSV ファイルを読み込み,Ruby の連想配列に格納,
- rsruby を用いたグラフの作成(散布図を例として説明),
- グラフへの線,凡例の重ね書き,
- グラフのファイルへの保存
前準備
Ubuntu の場合
Ubuntu を使用する場合は,次のように操作する.
- Ubuntu で Ruby 処理系のインストール
- Ubuntu で R 処理系のインストール
- (オプション) R システムでのパッケージのインストールの Web ページの記述に従って,Rcmdr のインストールが済んでいること.
- Ubuntu で rsruby のインストール
Windows の場合
Windows を使用する場合は,次のように操作する.
- Ruby と DevKit のインストール(Ruby インストーラ 3.1.2 を使用)(Windows 上): 別ページ »で説明
- Windows で R 処理系のインストール
- (オプション) R システムでのパッケージのインストールの Web ページの記述に従って,Rcmdr のインストールが済んでいること.
- Windows の環境変数 PATH に「C:\R\R-2.14.1\bin\i386」を追加
- Windows で rsruby のインストール
CSVファイルを読み込み,Ruby の連想配列に格納 (Read CSV file, and store into an HashTable of Ruby)
- (前準備) 使用する CSV ファイルの作成
ここでは,テスト用の CSV ファイル Book1.csv をダウンロードし, ディレクトリ C:\R\の下におくことにします.
* Ubuntu の場合は /tmp の下などに置く(要するにどこでも良い)
- 使用する CSV ファイルの確認
この Web ページのプログラムでは,1行目がヘッダー.2行目以降がデータ本体になっている必要がある. CSV ファイルの1行目に,各列の属性名が書かれていることを確認する.
テスト用の CSV ファイル Book1.csv では, 属性名として seq, date, USD, EUR, AUD の5つが 書かれている.
- CSVファイルを読み込み,Ruby の連想配列に格納するプログラム (Read CSV file, and store into an HashTable of Ruby)
まだ rsruby は使っていません.このプログラムを書き換えて,いろいろなグラフ作成に使うことします.
require 'rubygems' require "csv" reader = CSV.open("/tmp/Book1.csv", "r") header = reader.take(1)[0] T = Hash::new header.each do |attr| T[attr.strip] = [] end reader.each do |row| i = 0 row.each do |item| T[header[i].strip].push(item.strip) i = i + 1 end end
rsruby を用いたグラフ作成例
ここでは x, y 値を指定しての散布図の作成を行う.x 値を格納したベクトル,y 値を格納したベクトルを引数として R の plot() 関数を使うと,散布図が描かれます.
- 散布図以外のいろいろなグラフについては,R システムでの種々のグラフの Web ページを見てください.
- グラフの調整については,グラフ作成での各種パラメータの Web ページを見てください.
◆ Ubuntu の場合の実行手順例
export R_HOME=/usr/lib/R
irb
require 'rubygems'
require "csv"
require 'rsruby'
reader = CSV.open("/tmp/Book1.csv", "r")
header = reader.take(1)[0]
T = Hash::new
header.each do |attr|
T[attr.strip] = []
end
reader.each do |row|
i = 0
row.each do |item|
T[header[i].strip].push(item.strip)
i = i + 1
end
end
# draw scatter graph
r = RSRuby::instance
r.eval_R(<<-RCOMMAND)
X <- matrix( c( #{T["seq"].join(",")} ), 1, #{T["seq"].size} )
Y <- matrix( c( #{T["USD"].join(",")} ), 1, #{T["USD"].size} )
plot(X, Y)
RCOMMAND

重ね書きの例
points() 関数や line() 関数 や legend() 関数や text() 関数を使って,簡単に重ね書きできる.例を示しておきます. 次のような感じになります(文法の詳細には立ち入りません).
線の重ね書き
lines() 関数は,線を重ね書きするもの.
◆ Ubuntu の場合の実行手順例
export R_HOME=/usr/lib/R
irb
require 'rubygems'
require "csv"
require 'rsruby'
reader = CSV.open("/tmp/Book1.csv", "r")
header = reader.take(1)[0]
T = Hash::new
header.each do |attr|
T[attr.strip] = []
end
reader.each do |row|
i = 0
row.each do |item|
T[header[i].strip].push(item.strip)
i = i + 1
end
end
# draw scatter graph
r = RSRuby::instance
r.eval_R(<<-RCOMMAND)
X <- matrix( c( #{T["seq"].join(",")} ), 1, #{T["seq"].size} )
Y <- matrix( c( #{T["USD"].join(",")} ), 1, #{T["USD"].size} )
plot(X, Y)
lines(lowess( X, Y ), col = "red")
lines(lowess( X, Y, f=0.2 ), col = "green")
RCOMMAND

平滑化の関数は,他にも,smooth.spline(), ksmooth(), supsmu() などが知られている.
凡例の重ね書き
legend() 関数では,次を指定する.
- x 座標
- y 座標
- 凡例として表示する文字列ベクトル
- オプション
【関連する外部ページ】: href="http://www.okada.jp.org/RWiki/?%A5%B0%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF%A5%B9%BB%B2%B9%CD%BC%C2%CE%E3%BD%B8%A1%A7%CB%DE%CE%E3 (現存しない)
グラフィックス参考実例集:凡例 (http://www.okada.jp.org/RWiki/?%A5%B0%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF%A5%B9%BB%B2%B9%CD%BC%C2%CE%E3%BD%B8%A1%A7%CB%DE%CE%E3)
export R_HOME=/usr/lib/R
irb
require 'rubygems'
require "csv"
require 'rsruby'
reader = CSV.open("/tmp/Book1.csv", "r")
header = reader.take(1)[0]
T = Hash::new
header.each do |attr|
T[attr.strip] = []
end
reader.each do |row|
i = 0
row.each do |item|
T[header[i].strip].push(item.strip)
i = i + 1
end
end
# draw scatter graph
r = RSRuby::instance
r.eval_R(<<-RCOMMAND)
X <- matrix( c( #{T["seq"].join(",")} ), 1, #{T["seq"].size} )
Y <- matrix( c( #{T["USD"].join(",")} ), 1, #{T["USD"].size} )
plot(X, Y)
lines(lowess( X, Y ), col = "red")
lines(lowess( X, Y, f=0.2 ), col = "green")
legend( 5, 105, c( "f = 2/3", "f = 0.2" ), lty = 1, col = c("red", "green") )
RCOMMAND

テキストを書くこともできる.
text(locator(1), labels = "ほげほげ")
ファイルへの保存
グラフィカル・デバイスの種類(例)
- postscript pdf pictex : LaTeX/PicTeX ファイル
- png : PNG ファイル
- jpeg : JPEG ファイル
- bmp : BMP ファイル
など.
例えば,PDF ファイルを作りたいときは,最初に「pdf()」を実行.最後に「dev.off()」で,ファイルを閉じる. すると,作業ディレクトリにファイルができる.作業ディレクトリは,getwd() で分かる.
* pdf( file="/tmp/.png" ) のように,ファイル名を陽に指定する方が分かりやすいでしょう.
◆ Ubuntu の場合の実行手順例
export R_HOME=/usr/lib/R
irb
require 'rubygems'
require "csv"
require 'rsruby'
reader = CSV.open("/tmp/Book1.csv", "r")
header = reader.take(1)[0]
T = Hash::new
header.each do |attr|
T[attr.strip] = []
end
reader.each do |row|
i = 0
row.each do |item|
T[header[i].strip].push(item.strip)
i = i + 1
end
end
# draw scatter graph
r = RSRuby::instance
r.eval_R(<<-RCOMMAND)
X <- matrix( c( #{T["seq"].join(",")} ), 1, #{T["seq"].size} )
Y <- matrix( c( #{T["USD"].join(",")} ), 1, #{T["USD"].size} )
png( file="/tmp/1.png" )
plot(X, Y)
dev.off()
RCOMMAND
出来たファイル(ここでは /tmp/1.png)を表示させると,次のようになる.
