[R]読み込んだ画像ファイルの大きさや色数を調べる
dim関数を使う。
> img <- readPNG(system.file("img", "Rlogo.png", package = "png"))
> dim(img)
[1] 76 100 4
これは、読み込んだ画像ファイル Rlogo.png は、高さが76ピクセル、幅が100ピクセル、色数は4バイト(32ビット)ということ。
dim関数を使う。
> img <- readPNG(system.file("img", "Rlogo.png", package = "png"))
> dim(img)
[1] 76 100 4
これは、読み込んだ画像ファイル Rlogo.png は、高さが76ピクセル、幅が100ピクセル、色数は4バイト(32ビット)ということ。
plot関数で図を描画すると、初期状態では、縦横比が1で描画される(縦軸と横軸のスケールを等しくして描画するということ)。ただし、表示された図のウィンドウを、マウスなどで変形させると、それに応じて縦横比が変化する。
> x <- c(0, 1, 2, 3, 4)
> y <- c(0, 1, 2, 3, 4)
> plot(x, y)
> plot(x, y, asp = 1)
> plot(x, y, asp = 2 / 1)
オプションpchに21~25の値を与えて描画すればよい。21~25はそれぞれ丸(○)、四角(□)、菱形(◇)、上向き三角(△)、下向き三角(▽)である。その際の縁の色はcolオプションで、中を塗りつぶす色はbgオプションで指定をする。以下、描画の例。
xl <- c(0, 5)
yl <- c(0, 5)
plot(0, 0, xlim = xl, ylim = yl, type = "n", xlab = "", ylab = "")
# まず直線を描画
segments(0, 0, 5, 5)
# 黒実線の円、中は透過
points(1, 1, pch = 1, cex = 3)
# 赤く塗りつぶされた丸
points(2, 2, pch = 16, cex = 3, col = "red")
# 縁は赤実線、中は白塗りつぶしの丸
points(3, 3, pch = 21, cex = 3, col = "red", bg = "white")
# 縁の線を太くして、中は青で塗りつぶしてみる
points(4, 4, pch = 21, cex = 3, lwd = 4, col = "red", bg = "blue")
実行結果は以下のとおり。
一般に近似曲線などはプロット点の下に描画したほうが見栄えは良く、図中の一番左下のプロット点は美しくない。左下から2番目や3番目のように描画するべきである。4番目はあくまで描画例であり、実際の図でこのような色の組み合わせは使ってはいけない。
ggplot2パッケージでは、xlim関数などを使用して特に意識をしないで図を作成すると、図の枠線内の描画範囲(軸の範囲)は、その外側にある程度余白を付けて描画される。
> library(ggplot2)
> x <- c(1, 2, 3)
> y <- c(1, 4, 9)
> dtf <- data.frame(x, y)
> g <- ggplot(dtf, aes(x = x, y = y)) + geom_point()
> g <- g + xlim(0, 4) + ylim(0, 10)
> print(g)
特に何も指定しないと描画範囲が横軸がおおよそ-0.1~4.1、縦軸がおおよそ-0.1~10.1となり、指定した範囲きっかりに描画されない。ここでxlim、ylim関数ではなくcoord_cartesian関数を使用して、縦横それぞれの軸の範囲を指定する。
> g <- ggplot(dtf, aes(x = x, y = y)) + geom_point()
> g <- g + coord_cartesian(xlim = c(0, 4), ylim = c(0, 10))
> print(g)
Rの基本グラフィックであるplot関数および関係する関数では、図の枠線内の描画範囲(軸の範囲)を指定すると、その外側にある程度余白を付けて描画される。
例えば、以下のようにxlimオプションを使用して横軸の範囲を0~4に、ylimオプションを使用して縦軸の範囲を0~10に指定して図を描画すると、以下のようになる。
> x <- c(1, 2, 3)
> y <- c(1, 4, 9)
> plot(x, y, xlim = c(0, 4), ylim = c(0, 10))
図を見てのとおり、図の枠線内の横軸の範囲はおおよそ-0.1~4.1、縦軸はおおよそ-0.1~10.1となり、xlimとylimオプションに指定した範囲きっかりに描画されていない。
軸の範囲を指定した値きっかりにするには、xaxsおよびyaxsオプションに"i"を指定すればよい。
> x <- c(1, 2, 3)
> y <- c(1, 4, 9)
> plot(x, y, xlim = c(0, 4), ylim = c(0, 10), xaxs = "i", yaxs = "i")
今度は、枠線内は指定した範囲(横軸:0~4、縦軸:0~10)きっかりに描画されるようになった。
xaxs、yaxsオプションは初期状態では"r"となっており、この場合は4%伸張して描画するとplot.windowのヘルプに書かれている(Note that the coordinate ranges will be extended by 4% if the appropriate graphical parameter xaxs or yaxs has value "r" (which is the default). )。
パッケージjpegをインストールしてラスターイメージオブジェクトにすれば簡単に取得できる。
ラスターイメージは単純な配列であり、その配列の要素数を調べれば縦横のピクセル幅を得ることができる。
以下のような幅128ピクセル、高さ64ピクセルの画像を例として扱う。
まず、パッケージjpegをインストールして使える状態にする。
> install.packages("jpeg")
Installing package into ・・・
(表示省略)
> library(jpeg)
readJPEG関数でラスターイメージにすると、dim関数を使うと画像ファイルの縦横のピクセル幅を得ることができる。dim関数でラスターイメージを指定したときにベクトルが返される。1つ目が縦方向のピクセル幅。2つ目が横方向のピクセル幅。
> image <- readJPEG("image.jpg")
> mode(image) # モードは数値
[1] "numeric"
> class(image) # クラスは配列
[1] "array"
> dim(image) # 次元を得る
[1] 64 128 3
> dim(image)[1] # 画像ファイルの縦方向のピクセル幅
[1] 64
> dim(image)[2] # 画像ファイルの横方向のピクセル幅
[1] 128
PNG形式の画像ファイルを図の任意の位置に貼り付ける。
pngパッケージを使えば、Rの標準搭載のグラフィックス(graphicsパッケージ)を使用して図に画像を貼り付けることができる。
pngパッケージをインストールして使える状態にする。このパッケージに含まれるreadPNG関数を使用して画像ファイルを読み込み、rasterImage関数で画像を貼り付ければよい。
なお、ここで重要なrasterImage関数の引数は以下のとおり。
rasterImage(image, xleft, ybottom, xright, ytop)
以下は実際に貼り付け例。以下は貼り付け例で使用したPNG画像image.png。大きさは幅128、高さ64ピクセル。
まずはパッケージpngをインストールする。
> install.packages("png")
Installing package into ・・・
(表示省略)
パッケージpngを使える状態にして、実際に図に貼り付けてみる。
> library(png)
> plot(0, 0, type = "n", xlim = c(0, 10), ylim = c(0, 10))
> image <- readPNG("image.png")
> rasterImage(image, 0, 0, 8, 2)
> rasterImage(image, 2, 4, 4, 10)
> rasterImage(image, 6, 1, 10, 8)
> rasterImage(image, 6, 9, 11, 12)
結果は以下のとおり。
図を見てのとおり、重なる場合はあとから貼り付けられた画像が上書きされる。図の描画範囲からはみ出てたものは描画されない。右上はわかりにくいが、図枠も上書きされてしまっていることに注意。
layout関数を使用して複数のグラフを並べて書いたものをdev.copy2eps関数でEPS形式で出力すると、EPSファイルに不要な余白が付くことがある。これは、何度か試しに図を描画して、その描画ウィンドウを閉じることなく大きさを変えてそのままにしていると、不要な余白が付く。
これは、dev.copy2eps関数は作図デバイスを出力しようとしていることから、その出力ウィンドウの形を変えてしまうと、その変えた状態で出力されてしまう。
具体的な対策としては、layout関数を使用して描画する前は、最初にframe関数を実行して、グラフを消去すること。そうすることで、描画するときは作図デバイスが新たに作成されて、不要な余白が付かないで出力される。
Rの基本機能のグラフィック(plot関数、points関数など)で作成した図に画像ファイルを簡単に貼り付けることができる。貼り付けるには、pixmapパッケージのaddlogo関数を使用すればよい。
以下はpixmapパッケージに付属のサンプル画像(PNM形式、.ppm)の画像ファイルをplot関数、points関数と共に使用した例。
addlogo関数のpx、pyオプションに指定をした範囲に画像が貼り付けられる。縦横比が画像と異なる場合はその範囲に合うように伸縮されて貼り付けられる。当然、縦横比は合わなくなるので注意。
> install.packages("pixmap")
> library(pixmap)
> # サンプルの画像ファイルの読み込み
> # (警告があるかもしれないが無視してかまわない)
> g <- read.pnm(system.file("pictures/logo.ppm", package = "pixmap")[1])
> plot(g) # とりあえずサンプル画像を表示
> x <- 1:10 # 描画サンプルのためのデータ
> y <- 1:10 # 同上
> plot(x, y) # サンプル画像を消してサンプルデータをプロット
> # 読み込んだサンプル画像を2点(1,1)、(6,3)の範囲に描画
> addlogo(g, px = c(1, 6), py = c(1, 3))
> # 図を重ねて描画できる
> addlogo(g, px = c(4, 6), py = c(2, 8))
> # プロット点を図の上に描画する
> points(x, y, col = "red")
> # 図の枠線からはみ出でたところは描画されない
> addlogo(g, px = c(-2, 20), py = c(-5, 12))
最後の、図の枠線からはみ出た範囲で描画することについて、理由はよくわからないが、画像を描画すると図の枠線の上に書かれてしまう。この原因は不明。なお、画面上は図の枠線に上書きされていても、dev.copy2eps関数を使用してEPS形式でファイルに出力すると、枠線はきちんと描画される。ただし、dev2bitmap関数でBMP形式で出力した画像ファイルでは枠線は上書きされた状態である。原因は不明。