R (グラフィックス)

2018年11月27日 (火)

[R]読み込んだ画像ファイルの大きさや色数を調べる

dim関数を使う。

> img <- readPNG(system.file("img", "Rlogo.png", package = "png"))
> dim(img)
[1]  76 100   4

これは、読み込んだ画像ファイル Rlogo.png は、高さが76ピクセル、幅が100ピクセル、色数は4バイト(32ビット)ということ。

2018年11月 5日 (月)

[R]plot関数で図の描画する際の図の縦横比を指定する

plot関数で図を描画すると、初期状態では、縦横比が1で描画される(縦軸と横軸のスケールを等しくして描画するということ)。ただし、表示された図のウィンドウを、マウスなどで変形させると、それに応じて縦横比が変化する。

plot関数で特に何もしてせずにプロットする。

> x <- c(0, 1, 2, 3, 4)
> y <- c(0, 1, 2, 3, 4)
> plot(x, y)

Figure01 横軸と縦軸は元の値に対して同じ倍率で描画される。この図が描画されているウィンドウを、マウスを使って横長に変形するとこのようになる。
Figure02 横軸も縦軸も描画範囲は同じ(0~4)で、横軸は縦軸と比べて元の値に対して倍率が大きくなってしまっている。
plot関数のaspオプションはこれを指定することができる。aspオプションに1を指定すると、横軸と縦軸の描画倍率を1にする。

> plot(x, y, asp = 1)

Figure03 とくに何も指定しないと、横軸も縦軸も同じ倍率で描画されるが、上記と同様に、マウスを使用して、図が描画されているウィンドウを横長に変形してみる。
Figure04 横軸と縦軸の元の値に対する倍率は揃ったままに、横軸の描画範囲が広がっただけとなっている。
このaspオプションは「横軸の倍率/縦軸の倍率」の値で指定をする。例えば、同じ値に対して、縦軸の描画を2倍にするのであれば、aspオプションに「2/1」(= 2)を指定すればよい。

> plot(x, y, asp = 2 / 1)

Figure05_2

2015年2月 8日 (日)

[R]プロット点の縁と中を別々の色で塗りつぶす

オプション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")

実行結果は以下のとおり。Figure 一般に近似曲線などはプロット点の下に描画したほうが見栄えは良く、図中の一番左下のプロット点は美しくない。左下から2番目や3番目のように描画するべきである。4番目はあくまで描画例であり、実際の図でこのような色の組み合わせは使ってはいけない。

2014年12月16日 (火)

[R]ggplot2パッケージによる図を、簡単に並べて表示する

gridExtraパッケージのgrid.arrange関数を使えばよい。以下、使用例。

> library(ggplot2)
> library(gridExtra)
> x <- c(1, 2, 3)
> y1 <- c(1, 4, 9)
> y2 <- c(9, 4, 1)
> y3 <- c(4, 4, 5)
> g1 <- qplot(x, y1)
> g2 <- qplot(x, y2)
> g3 <- qplot(x, y3)
> grid.arrange(g1, g2, g3, nrow = 2)

Figure4

2014年12月 9日 (火)

[R]ggplot2による図の枠線内の描画範囲(軸の範囲)をxlim、ylimで指定をした値きっかりにしたい

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)

Figure21
特に何も指定しないと描画範囲が横軸がおおよそ-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)

Figure22
今度は、枠線内は指定した範囲(x:0~4、y:0~10)きっかりに描画されるようになった。

2014年12月 7日 (日)

[R]図の枠線内の描画範囲(軸の範囲)をxlim、ylimオプションで指定をした値きっかりにしたい

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))

Figure11

図を見てのとおり、図の枠線内の横軸の範囲はおおよそ-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")

Figure12

今度は、枠線内は指定した範囲(横軸: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). )。

2014年10月17日 (金)

[R]JPEG形式の画像ファイルのサイズ(縦横のピクセル幅)を得る

パッケージjpegをインストールしてラスターイメージオブジェクトにすれば簡単に取得できる。

ラスターイメージは単純な配列であり、その配列の要素数を調べれば縦横のピクセル幅を得ることができる。

以下のような幅128ピクセル、高さ64ピクセルの画像を例として扱う。

Image_4

まず、パッケージ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

2014年10月16日 (木)

[R]PNG形式の画像ファイルを図の任意の位置に貼り付ける

PNG形式の画像ファイルを図の任意の位置に貼り付ける。

pngパッケージを使えば、Rの標準搭載のグラフィックス(graphicsパッケージ)を使用して図に画像を貼り付けることができる。

pngパッケージをインストールして使える状態にする。このパッケージに含まれるreadPNG関数を使用して画像ファイルを読み込み、rasterImage関数で画像を貼り付ければよい。

なお、ここで重要なrasterImage関数の引数は以下のとおり。

rasterImage(image, xleft, ybottom, xright, ytop)

  • image - ラスターオブジェクト
  • xleft - 画像を貼り付ける際の左端の座標
  • ybottom - 〃〃の下端の座標
  • xright - 〃〃の右端の座標
  • ytop - 〃〃の上端の座標

以下は実際に貼り付け例。以下は貼り付け例で使用したPNG画像image.png。大きさは幅128、高さ64ピクセル。

Image_3

まずはパッケージ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)

結果は以下のとおり。

Result_png_2

図を見てのとおり、重なる場合はあとから貼り付けられた画像が上書きされる。図の描画範囲からはみ出てたものは描画されない。右上はわかりにくいが、図枠も上書きされてしまっていることに注意。

2014年9月13日 (土)

[R]layout関数を使用して複数のグラフを書いたものをEPS形式で出力すると、不要な余白が付く

layout関数を使用して複数のグラフを並べて書いたものをdev.copy2eps関数でEPS形式で出力すると、EPSファイルに不要な余白が付くことがある。これは、何度か試しに図を描画して、その描画ウィンドウを閉じることなく大きさを変えてそのままにしていると、不要な余白が付く。

これは、dev.copy2eps関数は作図デバイスを出力しようとしていることから、その出力ウィンドウの形を変えてしまうと、その変えた状態で出力されてしまう。

具体的な対策としては、layout関数を使用して描画する前は、最初にframe関数を実行して、グラフを消去すること。そうすることで、描画するときは作図デバイスが新たに作成されて、不要な余白が付かないで出力される。

2014年9月11日 (木)

[R]図の任意の位置に画像ファイルを貼り付ける

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形式で出力した画像ファイルでは枠線は上書きされた状態である。原因は不明。