Ruby で rsruby を用いてグラフ作成

このページでは,rsruby を用いたグラフ作成について, 次のことを行う手順を説明する.

前準備

Ubuntu の場合

Ubuntu を使用する場合は,次のように操作する.

  1. Ubuntu で Ruby 処理系のインストール
  2. Ubuntu で R 処理系のインストール
  3. (オプション) R システムでのパッケージのインストールの Web ページの記述に従って,Rcmdr のインストールが済んでいること.
  4. Ubuntu で rsruby のインストール

Windows の場合

Windows を使用する場合は,次のように操作する.

  1. Ruby と DevKit のインストール(Ruby インストーラ 3.1.2 を使用)(Windows 上): 別ページ »で説明
  2. Windows で R 処理系のインストール
  3. (オプション) R システムでのパッケージのインストールの Web ページの記述に従って,Rcmdr のインストールが済んでいること.
  4. Windows環境変数 PATH に「C:\R\R-2.14.1\bin\i386」を追加
  5. Windows で rsruby のインストール

CSVファイルを読み込み,Ruby の連想配列に格納 (Read CSV file, and store into an HashTable of Ruby)

  1. (前準備) 使用する CSV ファイルの作成

    ここでは,テスト用の CSV ファイル Book1.csv をダウンロードし, ディレクトリ C:\R\の下におくことにします.

    * Ubuntu の場合は /tmp の下などに置く(要するにどこでも良い)

  2. 使用する CSV ファイルの確認

    この Web ページのプログラムでは,1行目がヘッダー.2行目以降がデータ本体になっている必要がある. CSV ファイルの1行目に,各列の属性名が書かれていることを確認する.

    テスト用の CSV ファイル Book1.csv では, 属性名として seq, date, USD, EUR, AUD の5つが 書かれている.

  3. 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() 関数を使うと,散布図が描かれます.

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() 関数では,次を指定する.

関連する外部ページ】: 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 = "ほげほげ")

ファイルへの保存

グラフィカル・デバイスの種類(例)

など.

例えば,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)を表示させると,次のようになる.