金子邦彦研究室プログラミングRuby による Web/データベース・プログラミングRuby で rsruby を用いてグラフ作成

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

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

前準備

Ubuntu の場合

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

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つが 書かれている.

    [image]
  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

[image]

重ね書きの例

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

[image]

平滑化の関数は,他にも,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

[image]

テキストを書くこともできる.

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

[image]