21  グラフ作成:低レベルグラフィック関数とグラフィックパラメータ

前章で説明した高レベルグラフィック関数は、少数の引数を与えれば軸や点の位置、グラフの種類等をほぼ自動的に設定してくれる関数です。

一方で、低レベルグラフィック関数は、グラフ上に点や線、文字などを逐次追加していくための関数です。Rでは基本的には高レベルグラフィック関数を用いて大まかなグラフを作成し、追加で説明などを加えたいときには低レベルグラフィック関数を用います。低レベルグラフィック関数の一覧を以下の表1に示します。

表1:低レベルグラフィック関数
関数名 関数の意味
points(x, y) x, yで指定した場所に点を追加
text(x, y, label) x, yで指定した場所にlabelで指定したテキストを追加
abline(a, b) 傾きb,切片aの線を追加
abline(h) hで指定したy軸の位置に横線を追加
abline(v) vで指定したx軸の位置に縦線を追加
polygon(x, y) x, yで指定した点をつなぐ形を追加
rect(xleft, ybottom, xright, ytop) 指定したサイズの長方形を追加
symbols(x, y, circles) x, yで指定した位置に図形(円など)を追加
arrows(x0, y0, x1, y1) x0, y0の位置からx1, y1の位置までの矢印を追加
legend(x, y, legend) 凡例を追加
title(main, sub) グラフのタイトルを追加
axis(side) sideで指定した位置に軸を追加
grid() グリッド線を追加

21.1 points関数

points関数は、すでに存在するグラフに点を追加するための関数です。points関数はxyの2つの引数を取り、そのxyが示す場所に点を追加します。

point関数で点を描画
plot(x = 0, y = 0, type = "n", xlab = "", ylab = "") # 軸だけのプロット
points(x = 0, y = 0) # x=0, y=0に点を追加

21.2 text関数

text関数は、グラフに文字を追加するための関数です。text関数はxylabelの3つの引数を取り、そのxyが示す場所にlabelsで指定した文字列を追加します。

text関数でテキスト表示
plot(x = 0, y = 0, type = "n", xlab = "", ylab = "")
text(x = 0, y = 0, labels = "added text") # x=0, y=0にテキストを追加

21.3 abline関数

abline関数はグラフに直線を追加するための関数です。abline関数の引数の指定方法には以下の4種類があります。

  • 切片(引数a)と傾き(引数b)を指定する
  • 横線のy軸の位置(引数h)を指定する
  • 縦線のx軸の位置(引数v)を指定する
  • 線形回帰の結果(引数coef)を指定する
abline関数で直線を引く
plot(x = 0, y = 0, type = "n", xlab = "", ylab = "")
abline(a = -0.5, b = 2, col = "red") # y = 2 x - 0.5 の線を追加
abline(h = 1, col = "blue") # y = 1 の水平線を追加
abline(v = -1, lty = 2, col = "darkgreen") # x = -1 の縦線(点線)を追加

21.4 多角形・図形・矢印を追加

グラフ上に多角形や長方形、図形、矢印を追加する場合には、それぞれpolygon関数、rect関数、symbols関数、arrows関数を用います。

polygon関数は、引数xyに数値のベクターを取り、そのベクターで指定したxyの点を繋げた多角形を追加する関数です。始点と終点が一致していれば閉じた多角形を、一致していなければ閉じていない多角形を描画します。

rect関数は長方形を追加するための関数です。rect関数では、引数xleftxrightで長方形の左端、右端、引数ybottomytopで長方形の下端、上端を指定します。

symbols関数は引数xyに指定した位置に図形を追加するための関数です。symbols関数で指定できる図形は、円(circles)、正方形(squares)、長方形(rectangles)、星(stars)、温度計(thirmometers)、箱ひげ図(boxplot)です。図形名を引数に取り、数値で図形の詳細を指定することでそれぞれの図形を描画できます。

arrows関数は矢印を追加するための関数です。arrows関数の始めの2つの引数(x0y0)には矢印の始点の座標を、3つ目と4つ目の引数(x1y1)には矢印の終点の座標をそれぞれ指定します。

様々な図形の描画
par(mai = c(0.1, 0.1, 0.1, 0.1))
plot(x = 0, y = 0, type = "n", xlab = "", ylab = "", axes = FALSE)
polygon( # 多角形(星形)を追加
  x = c(0, 0.2245, 0.9511, 0.3633, 0.5878, 0, -0.5878, -0.3633, -0.9511, -0.2245, 0, 0.2245) * 0.25 - 0.5,
  y = c(1, 0.309, 0.309, -0.118, -0.809, -0.382, -0.809, -0.118, 0.309, 0.309, 1, 0.309)* 0.25 + 0.5, 
  col = "#48C9B0"
)
# 長方形を追加
rect(xleft = 0, xright = 0.5, ybottom = 0.25, ytop = 0.75, col = "#E74C3C")
# 円を追加
symbols(x = -0.5, y = -0.5, circles = 0.1, add = TRUE, inches = 0.3, col = "#5DADE2")
# 矢印を追加
arrows(x0 = 0.25, y0 = -0.75, x1 = 0.5, y1 = -0.5, col = "#A569BD")

21.5 凡例とタイトルの追加

legend関数は凡例(legend)を追加するための関数です。legend関数はxylegendの3つの引数を取り、xyには凡例の位置を、legendには凡例の説明を示す文字列をそれぞれ引数に取ります。

title関数はグラフのタイトルを追加するための関数です。title関数では、mainsubの2つの引数にそれぞれメインタイトル、サブタイトルを文字列で指定することで、それぞれのタイトルをグラフに追加することができます。

凡例(legend)とタイトル(title)の表示
plot(x = 0, y = 0, type = "n", xlab = "", ylab = "")
# 凡例(legend)を追加
legend(x = 0.5, y = -0.5, legend = "point", pch = 1)
# タイトルを追加
title(main = "メインタイトル", sub = "サブタイトル")

21.6 軸とグリッドの操作

axis関数はグラフの縦・横軸を追加するための関数です。axis関数の引数は数値の1~4で、1からそれぞれ下・左・上・右の軸の追加を意味します。

グリッド線の追加に用いるのがgrid関数です。grid関数を引数無しで指定すれば、すでに記述されている軸ラベルに従いグリッド線を追加してくれます。引数でグリッドの間隔を指定することもできます。

軸・グリッドの追加
# 軸のないプロットの表示
plot(x = 0, y = 0, type = "n", xlab = "", ylab = "", axes = FALSE)
axis(1) # 下に軸を追加
axis(2) # 左に軸を追加
grid() # グリッドを追加

21.7 グラフィックパラメータ

Rのグラフ作成では、グラフィックパラメータと呼ばれる引数を指定し、点や線、色や軸ラベル等を調整することができます。

グラフィックパラメータはpar関数の引数として用います。plot関数などの高レベルグラフィック関数では、引数として一部のグラフィックパラメータを使用することもできます。Rのグラフィックパラメータは60以上あり、うまく利用すれば見やすく、理解しやすいグラフを作成することもできます。グラフィックパラメータの一覧を以下の表2に示します。

21.8 重ね書き:new=T

前章で説明した通り、Rではすでに記述しているグラフに、別のグラフを重ね書きすることができます。この重ね書きに用いるのが、new=Tというグラフィックパラメータです。par(new=T)を宣言すると、宣言前に作図したグラフを消去することなく、同じデバイス上に次のグラフが追加されます。

par(new=T)でグラフの重ね書き
plot(1:10)
par(new = T) # デバイス上のグラフを消去しない
plot(10:1, col = "red") # 赤のプロットを追加

21.9 複数のグラフを1つのデバイスに表示

複数のグラフを1つのデバイス上に描画する場合には、グラフィックパラメータのmfrow引数又はmfcol引数を用います。いずれも引数に2つの数値からなるベクターを取ります。ベクターの1つ目の要素が行方向にデバイスを分割する数、2つ目の要素が列方向にデバイスを分割する数になります。このとき、mfrowmfcolのいずれを用いても、結果は同じになります。

グラフィックパラメータとしてpar関数内で引数mfrow又はmfcolを宣言した後、plot関数などの高レベルグラフィック関数を用いてグラフを描画します。plot関数では、引数mfgを用いて、グラフを表示する位置を指定します。位置は引数mfrowで指定した行、列の中で設定します。例えば、mfg=c(2, 3)と指定すると、そのグラフはグラフィックデバイスのうち、2行3列目に描画されます。

複数のプロットを表示1
# mfcolでもmfrowでも同じ。3行2列にデバイスを分割
par(mfrow = c(3, 2)) 
plot(1, mfg = c(1, 1)) # 1行1列目のグラフ
plot(1:10, 1:10, type = "l", mfg = c(1, 2)) # 1行2列目のグラフ
plot(iris$Sepal.Length, iris$Sepal.Width, mfg = c(2, 1)) # 2行1列目のグラフ
plot(Nile, mfg = c(2, 2))
hist(iris$Sepal.Length, mfg = c(3, 1))
boxplot(iris$Petal.Width~iris$Species, mfg = c(3, 2))

同様のデバイスの分割には、layout関数を用いることもできます。layout関数は行列を引数に取ります。行列の要素は数値で、数値の順にグラフが埋められていきます。

複数のプロットを表示2
layout(matrix(c(2, 4, 1, 3), nrow=2)) # 2行2列に分割
plot(1) # 行列の数値の順番にグラフが描画される
plot(iris$Sepal.Length, iris$Sepal.Width)
hist(iris$Sepal.Length)
boxplot(iris$Sepal.Width~iris$Species)

グラフの分割には、split.screen関数を用いることもできます。split.screen関数は引数に数値2つのベクターを取ります。1要素目の数値が行数、2要素目の数値が列数を示します。split.screen関数では、screen関数によって描画するグラフの位置を指定します。例えば、screen(n=2)を指定すると、分割したデバイスの2番目の位置に次のグラフが描画されることになります。

split.screen関数でプロットエリアを分割
split.screen(c(1, 3)) # 1行3列にデバイスを分割
[1] 1 2 3
plot(1) # 1つ目(一番左)に描画
screen(n = 2) # 2つ目に描画することを指定
plot(iris$Sepal.Length, iris$Sepal.Width)
screen(n = 3)
hist(iris$Sepal.Length)

Rのデフォルトの関数群を用いても、上記のように複数のグラフを1つのデバイスにまとめることはできます。ただし、上の図に見られるように、各グラフのラベルやサイズ、タイトルなどをうまく調節するためには、グラフィックパラメータを駆使する必要があります。複数のグラフを一度に表示したい場合には、latticeパッケージやggplot2パッケージを用いることで、デフォルトの関数よりも簡単に複数のグラフをまとめて作成することができます。

21.10 マージンの設定

マージン(余白)には、個々のグラフに対するマージンと、デバイスに対するマージンの2つがあります。デバイスにグラフを1つだけ表示する場合には、この2つのマージンは同じ意味を持ちます。

一方で、上で説明した通り、Rではデバイスを分割して複数のグラフを表示することができます。デバイスを分割する場合には、デバイス全体のマージンとは別に、表示する個々のグラフに対するマージンを設定することができます。

個々のグラフに対するマージンを設定するグラフィックパラメータはmaimarです。marmaiの違いは、maiがマージンをインチ単位で設定するのに対し、marは文字の行で設定する点です。いずれも要素が4つの数値ベクターでマージンを設定します。数値ベクターの要素はそれぞれ下、左、上、右のマージンを表したものとなります。

デフォルトの余白
plot(1)

maiで余白の調整
par(mai = c(2, 2, 2, 2))
plot(1)

デバイス全体のマージンを設定するグラフィックパラメータがomiomaです。omiomaの違いはmaimarと同じで、omiがインチ単位、omaが行単位でマージンを設定する引数です。要素が4つの数値ベクターで設定すること、要素がそれぞれ下、左、上、右のマージンを表すのも、maimarと同じです。

デフォルトの余白
# デフォルトの余白
par(mfcol = c(1, 2))
plot(1)
plot(1:10)

omiで余白の調整
# omiで余白を調整
par(omi = c(1, 1, 1, 1), mfcol = c(1, 2))
plot(1)
plot(1:10)

21.11 グラフの色の調整

グラフの色も、グラフィックパラメータを用いることで調整することができます。グラフの色に関わるグラフィックパラメータは、bgcolcol.axiscol.labcol.maincol.subfgです。それぞれ、背景色、点の色、軸の色、軸ラベルの色、メインタイトルの色、サブタイトルの色、枠の色を示します。色の設定を用いると、下のようにグラフの要素の色を変えたグラフを作成することもできます。

グラフの色の調整
par(bg = "lightgray") # 背景色はpar関数で呼び出し
plot(
  1:10, 
  cex=3, 
  col = "red", # 点の色は赤
  col.axis = "blue", # 軸の数値は青
  col.lab = "purple", #  軸のラベルは紫
  col.main = "pink", # メインタイトルはピンク
  col.sub = "orange", # サブタイトルはオレンジ
  fg = "violet", # 枠の色はバイオレット
  main = "メインタイトル", 
  sub = "サブタイトル"
  )

Rで用いることのできる色については、NCEAS (National Center for Ecological Analysis and Synthesis)が公開しているチートシートに詳しくまとめられています。

色はベクターで指定することもできます。

ベクターでグラフの色を指定
# Speciesがsetosaなら赤、それ以外は青で表示
plot(
  x = iris$Sepal.Length,
  y = iris$Sepal.Width,
  col = ifelse(iris$Species == "setosa", "red", "blue")
  )

21.12 インタラクティブグラフィック関数

グラフを描画した後、グラフをクリックすることでその点の値を得る場合には、locator関数を用います。locator関数は引数に数値を取り、その数値の回数だけグラフをクリックし、クリックした位置の値を得ることができます。得た値はxとyのリストで返ってきます。

locator関数でクリックした位置の値を取得する
plot(1:10)
locator(1) # 1つの点を選ぶ(xとyの値がリストで返ってくる)

同様に描画したグラフにテキストなどでラベルを表示するための関数が、identify関数です。identify関数は、xylabelsの3つの引数を取ります。xyにはラベルを表示したい位置、labelsにはそれぞれの点に表示するラベルを文字列で記載します。identify関数はRStudioでは正常に機能せず、RGUIでのみ機能します。

identify関数で値を取得する
x <- 1:7
y <- 1:7
plot(x, y)
# 点をクリックすると1~7のラベルが付く(RGUI)
identify(x, y, labels = 1:7)