トップページ -> 情報工学,情報スキルの教材 -> Ruby による Web/データベース・プログラミング -> Ruby で rsruby を用いてグラフ作成
[サイトマップへ]  

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

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


前準備

Ubuntu の場合

  1. Ubuntu で Ruby 処理系のインストール

  2. Ubuntu で R 処理系のインストール

  3. (オプション) R でのパッケージのインストールの Web ページの記述に従って,Rcmdr のインストールが済んでいること.

  4. Ubuntu で rsruby のインストール

Windows の場合

  1. Windows で Ruby 処理系と DevKit のインストール

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

参考 Web ページ: グラフィックス参考実例集:凡例 (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)を表示させると,次のようになる.