| Top Page | プログラミング | R 自動化 目次 | 索引 | 前へ | 次へ |

R でプログラミング:データの一括処理とグラフ描き

5. グラフのいろいろな設定と重ね描き

plotで散布図が一枚書けたというレベルから, 使える図を作るレベルへと進むには

ことがポイントになります.

このページでは,まずはパラメータの設定について説明します. とくに,文字のサイズやシンボルのサイズを自由に制御する方法を解説します.

続いて,高水準関数を何度も呼び出したり,高水準関数と低水準関数を 組み合わせたりして重ね描きするときの注意点を説明します. この場合は,座標系の設定の理解が重要になります. これらを理解すれば,プログラムで作図することもおっくうでなくなるでしょう.

なお,グラフ描きのためのさまざまなワザを網羅的に紹介することはしません. 実用的な見栄えの,ごくふつうのグラフを描くための基礎に限って紹介します. もっと凝ったことがやりたくなったら,自分で調べてみてください.

なお, 12章13章 では,論文や学会発表などに使える程度のグラフを描くための パラメータ設定をまとめてあります.

パラメータ設定の基礎知識

グラフの描き方を制御するパラメータは,おおきく分けて3通りの方法で設定できます.

  1. 作図デバイスのドライバを起動するときに引数で設定する
  2. 描画関数を呼ぶときに引数で設定する
  3. グラフィックスパラメータを設定する専用の関数 par を使って設定する

の3つです.そして,ややこしいことに

ということがあります. すべて頭に入れるのはたいへんなので, 定型的なやりかたのをひとつ決めてしまうと楽でしょう. たとえばこんな手順です.

  1. 作図デバイスを起動するときに,(必要なら)画像サイズを指定する.
  2. 関数 par を使って,基本となる文字の大きさを設定する.
  3. 作図関数を呼ぶときに,シンボルの大きさや先の太さ,色などを設定する.
以下では,これらの各ステップを順に説明します.


パラメータ設定の手順

作図デバイスを起動するときの設定

作図デバイスのデバイスドライバが起動する時点で,図のサイズが決ります. width とheight という引数にそれぞれ幅と高さのサイズを与えます. なにも指定しなければデフォルトの大きさになります. 明示的にデバイスドライバを起動せずに plot 関数などを呼ぶと, 描画画面のドライバがデフォルトのサイズで起動します.

png, jpeg, bmp など,ビットマップ画像の場合はピクセル単位, pdf, postscript, windows(描画画面), win.metafile などのベクトル画像の場合は長さ(インチ単位)で指定します (ビットマップ画像とベクトル画像については 別の文書を参照).

<練習>

関数 par による設定

入力画面で par() と入力すると,さまざまなパラメータの名前と現在の値が表示されます. それぞれの意味は help(par)で調べることができます.

…といっても,たくさんのパラメータがあってクラクラしますが, とりあえず,ひとつ覚えるとよいのは ps です. これはフォントの大きさ(point size) を指定するパラメータです. R のデフォルトの設定(設定変更する前の状態)は,点も字もかなり小さめです. ps のデフォルトの値は 12 ですが,もっと大きな値に設定すれば, 文字が大きくて見やすい図になります.

par(ps = 18)
plot(d$len, d$len)

とすれば,デフォルトよりもやや文字が大きい図が画面に表示されますし,

png('len_width.png', width = 450, height = 400)
par(ps = 18)
plot(d$len, d$width)
dev.off()

とすれば,450 x 400 ピクセルの画像ファイル len_width.png が作られ, そこに文字が大きめの図が書き込まれるはずです.

<練習>

なお,より細かく字の大きさを制御する方法を 12章で説明しています. 論文や学会発表に使うような図を描くには,そちらも参照してください.


このほか,画像全体のなかでのグラフの大きさや位置に関するものを 設定する必要もでてくるかもしれません.これについては,すこしあとの 「3つの領域」の節を見てください.

また,プロットのタイプ(線か点かなど),点のシンボルの種類なども par() で設定できますが,これらは描画関数での設定に任せることにしましょう.

全パラメータにどのような値が設定されているかを知るには, 引数なしで par() を実行します.また, 特定のパラメータの値を知るには,たとえば par('ps') のようにパラメータの名前を文字列として(引用符で囲んで)引数に与えます.


作図関数を呼ぶときの設定

作図関数では,点の色やサイズ,線の色,パターン,太さ,そのほか グラフの種類によりますが,いろいろな設定ができます. そのなかで,特によく使いそうなものをいくつか紹介します.

長さと幅のデータばかりで飽きたので,ここらで久しぶりに 新しいデータを使うことにします. temperature.txtというファイルで, 内容はこんな形式です.

day     Site01  Site02  Site03
1       -10.5   -0.7    9.9
2       -8.7    0.9     9.6
3       -6.5    0.2     9.8
....
363     -8.0    -1.0    9.7
364     -7.3    -1.1    10.0
365     -13.0   0.5     9.8

3ケ所での,一年間毎日の平均気温のデータ,という想定です(仮想的なものです). これを,read.table を使ってデータフレーム t に読み込みます.

t <- read.table('temperature.txt', header = TRUE)

そのあと,t$day と t$Site01 の関係をグラフにしてみましょう.ふたつのベクトルを plot に渡せば,それぞれを横軸,縦軸にとってグラフを描いてくれるのでした.

plot(t$day, t$Site01)

これでグラフが描けるはずです.

(注)この例では,t という名前のオブジェクトを作っています.R で最初から用意されている 関数にも t という名前のものがありますが,衝突しても問題はないようです.t なら ユーザが作ったオブジェクトが呼ばれ, t(2) とすれば関数が呼ばれます.

点をもっと大きくするには, cex というパラメータを使います.デフォルトの設定の何倍にするかを指定するもので, 1 なら1倍,すなわちデフォルトのまま,1.5 なら5割増しになります.

plot(t$day, t$Site01, cex = 1.5)

点の種類を変えるには,pch というパラメータを使います.たぶん,point character から来ている名前でしょう. これに1から25の数字を与えると,それぞれ違うシンボルが描かれます. 1番から25番まで,左から右へ並べてみました.

点に色をつけるには,col 引数を使います.関数colors() を実行すると, 用意されている色名の一覧が表示されます.その中から適当に選んで試してみてください. こんな感じです.

plot(t$day, t$Site01, col = 'blue')

RGB の値で指定することもできます. 指定のしかたは,col = '#RRGGBB' です (なんじゃそりゃ,と思ったかたは,気にせず無視してください).

点ではなくて線にしたいとか,点を線で結びたいとかいった場合, type というパラメータを使います.R-Tips の plot() の形式指定を見てみてください.

'l' や 'o' のように線を描くグラフの場合, lwd というパラメータ(たぶん line width のことでしょう) を使って線の太さを変えることができます. 1 が標準で,それより大きい値にすれば太くなります.

plot(t$day, t$Site01, type = 'l', lwd = 2, col = 'red')

上に挙げたパラメータの中には par()で指定できるものがたくさんあります. ただ,その効果が par で指定した場合と作図関数で指定した場合とで微妙に, あるいははっきりと異なるものがあってややこしくなっています.

cexなど,その最たるものです. ps と,parで設定した cex と,作図関数で指定した cex とが相互作用します. 説明を書くのも読むのもややこしいので省略. 探求心があるかたは実験してたしかめてください.

基本的には ps とグラフの大きさ関連以外のパラメータは作図関数で指定する ことにしてしまうのが分かりやすいでしょう.

ただ,lwd は par で設定する必要があるかもしれません. par(lwd = 3) などのように,par で lwd に大きな値を設定すると, グラフの軸の線も,プロットの線も,すべて太くなります (作図関数では軸を太くはできない). 作図関数でさらに plot(..., lwd = 1) などとすれば,軸は太いままで, グラフ中の線は標準の太さで描かれます.

<練習>

par での設定の有効範囲

すでに作図デバイスのドライバが起動しているとき,さらに他の作図デバイスの ドライバを起動することもできます.けれども複数のドライバが起動しているときでも, ある時点で書込みができるのはひとつだけです.そのデバイスをアクティブなデバイス と呼びます.基本的に,一番最後に起動したものがアクティブなデバイスです. そして,dev.off() すれば現在アクティブなデバイスが閉じ,そのひとつまえに 起動したデバイスがアクティブになります.

par()を使って設定したパラメータは,そのときアクティブな作図デバイスに対してのみ有効です. 開いているけどアクティブではないデバイスには影響しません. 下の例を実行して確かめてみてください. 使っているデータは,これまで何度も出てきておなじみの,'len_width.txt' のファイルを データフレーム d に読み込んだものです.

windows()             #  描画画面を用意.
par(ps = 18)          #  文字を大きく.
plot(d$len, d$width)  #  字が大きいグラフが描画画面に描かれる. 
png('len_width.png')  #  画像ファイルのデバイスドライバを起動.
plot(d$len, d$width)  #  ファイルに描かれるグラフの字は大きくない.
dev.off()             #  画像ファイルを閉じる.
plot(d$len, d$width)  #  ふたたび字が大きいグラフが描画画面に描かれる. 

また,アクティブなデバイスが閉じると,アクティブであるときの設定は すべて無効となります. 同じ種類のデバイスのドライバを再度起動しても,デフォルトの初期値に戻っています.

さまざまな描画プログラムの例をみると, 描画作業のまえに現在のグラフィックパラメータを一時的に変数にしまっている ことがあります.いろいろ設定を変えて作業したあと,この一時待避していた パラメータ設定にもどすためです.

これは,描画画面を開いたままでいろいろなグラフを描いていく場合には 意味があることです.けれども,画像ファイルを作製する場合には気にする必要は ありません. ファイルのドライバを起動してから設定したパラメータは,その時点でアクティブでない 作図デバイスのパラメータにはまったく影響しませんし,ファイルを dev.off で閉じれば(画像ファイルのドライバを終了すれば),そのファイル用の設定も すべて消えてしまうからです.


3つの領域

絵の'紙'の大きさに関する設定はデバイス起動時に,その紙のなかでの図の位置や大きさ に関する設定は par () でおこないます. 一枚の紙に複数のグラフを並べて書いたり,たくさん文字などを書き込むために余白を 広くとったりするために必要となる設定です.

くわしいことは help(par) で,どんな設定ができるか調べてみてください, とくに関係するパラメータはfig, fin, mai, mar, pin, plt などです… とだけ言われても,最初はよくわかりません. これらのパラメータの意味を理解のために,3つの「領域」の関係を知って おくことが必要です.デバイス領域,作図領域,プロット領域です. これらの関係を図示すると,このようになります.

言葉で説明すると以下のようになります.

○絵を描く領域は,

の3つが入れ子になって構成される.作図領域の,プロット領域以外の部分が余白(margin). デフォルトでは作図領域はデバイス領域全体と一致している.

○それぞれのサイズや位置の設定は以下のパラメータで行う.

これだけ見ると,デバイス領域と作図領域が別に用意されている理由が分かりません. これは,一枚の '紙' に複数のグラフを並べて描くときに意味を持ちます. はじめにデバイス領域の左半分を作図領域にしてグラフを描き,次に右半分を 作図領域にすれば,左右にグラフが並んだ図が出来上がります.

余白のサイズを決める mar と mai は,前者がラベルなどで書き込む文字の行数で, 後者がインチで指定するためのパラメータです. mar の場合,一行の高さがどれだけかが関係します.これは mex というパラメータで 変えられます.ディフォルトでは mex = 1 ですが,たとえば mex = 1.5 とすると, 一行の高さを 1.5 倍に換算したうえで,mar で指定される行数分の余白を確保しますので, 結果として余白が広く,プロット領域が狭くなります.

下の練習で,mex の効果を確認しましょう.使うデータは, ふたたび'len_width.txt' のファイルをデータフレーム d に読み込んだものです.

<練習>

| Top Page | プログラミング | R 自動化 目次 | 索引 | 前へ | 次へ |