plot() は R のオールインワン作図関数
R でグラフを描くには、同じ長さの数値ベクトル 2 つを渡して plot(x, y) を呼びます。R は組ごとに点を 1 つ描き(第 1 のベクトルが横軸、第 2 のベクトルが縦軸)、軸には変数名が自動的にラベル付けされます。
x <- 1:12
y <- c(2, 5, 4, 8, 9, 12, 11, 15, 14, 18, 17, 21)
plot(x, y)
結果は、x が大きくなるにつれて着実に上昇する 12 個の中空の円の散らばりです。参加費はこれだけです。インストールするパッケージも、下準備もありません。plot() は base R に同梱されており、手早い探索的グラフィックスの大半はこの関数が支えています。
このページのコード実行環境はテキスト出力しか表示できないため、この記事の作図呼び出しは静的なスニペットです。RStudio やローカルの R セッションに貼り付けて実際の絵を確認してください。ここで 実行できる のはデータの準備です。いずれにせよ良い習慣です。グラフにする前に数値を見ましょう。
ベクトルを 1 つだけ渡した場合、plot(y) はインデックス位置 1, 2, 3, … を横軸として使います。測定値の並びをざっと眺めるのに便利です。
グラフの種類を選ぶ
type 引数が、組をどう描くかを決めます。
plot(x, y, type = "p") # points (the default)
plot(x, y, type = "l") # a connected line
plot(x, y, type = "b") # both: points joined by line segments
plot(x, y, type = "h") # vertical bars from zero, like a spike chart
plot(x, y, type = "s") # a step function
type = "l" は散布図を折れ線グラフに変えます。時間を追って測定したものにはこれが適しています。type = "b" は個々の観測値を見えるままにしつつ傾向も示します。type = "h" はゼロから各値まで細い縦線を引き、type = "s" は次の値まで各値を保持する階段を描きます。価格や在庫数のように、飛び飛びに変化する量に便利です。
タイトル、ラベル、色
ラベルのないグラフは自分専用のメモです。それを直す引数が 3 つあります。main はタイトル、xlab と ylab は軸ラベルです。col は色を設定します。
plot(x, y,
type = "b",
main = "Monthly signups",
xlab = "Month",
ylab = "Signups (thousands)",
col = "steelblue")
col は 3 種類の値を受け取ります。
- 色名 —
"red"、"steelblue"、"tomato"、"darkgreen"など。R は 657 色を知っています。colors()を実行するとすべての名前が一覧できます。 - 16 進コード —
col = "#2C7FB8"、CSS とまったく同じです。 - 色のベクトル — 点ごとに 1 つずつ。これがグループ別に点を色分けする方法です:
groupが因子のときcol = c("tomato", "steelblue")[group]。
pch で点の記号、cex と lwd でサイズを指定する
既定の中空の丸は探索には十分ですが、他人に見せるものでは見づらくなります。pch(plotting character)が記号を選び、0 から 25 まで番号が付いています。
plot(x, y, pch = 19) # solid circle - the usual choice
plot(x, y, pch = 17) # solid triangle
plot(x, y, pch = 21, col = "black",
bg = "gold") # fillable circle: border + fill
覚えておく価値のある番号が 2 つあります。pch = 19 は完成版のグラフの多くが使う塗りつぶしの丸です。pch = 21 から 25 は 塗り分け可能 な記号で、col が枠線、bg が内側を着色するので、2 色の点が作れます。
サイズと線のスタイルには専用のつまみがあります。
cexは点のサイズを拡大縮小します:cex = 1.5は点を 1.5 倍にします。lwdはtype = "l"や"b"の線幅を設定します:lwd = 2はしっかり読める線になります。ltyは線のパターンを設定します:lty = 1は実線、2は破線、3は点線です。
重ね描き: points()、lines()、abline()
plot() は新しいグラフを開始します。既存のグラフの 上に 描くには、その仲間の関数を使います。これらは置き換えではなく、現在のグラフに追加します。
plot(x, y, type = "l", lwd = 2, col = "steelblue",
main = "Actual vs. target")
points(x, y, pch = 19, col = "steelblue") # add the observations
lines(x, x * 1.5, lty = 2, col = "gray40") # add a second series, dashed
abline(h = 10, col = "tomato") # horizontal reference line at y = 10
abline() は基準線を引く道具で、3 つのモードがあります。
abline(h = 10)— 指定した縦軸の値に水平線を引きます。abline(v = 6)— 指定した横軸の値に垂直線を引きます。abline(a = 0, b = 1.5)— 切片aと傾きbで直線を引きます。
最大の技は、当てはめたモデルを渡すと回帰直線を描いてくれることです — abline(lm(y ~ x))。この 1 行が散布図を主張に変えます。散布図のガイドではこれを土台にします。
守るべきルールがひとつあります。軸の範囲は最初の plot() 呼び出しで固定されます。重ねた系列がその範囲を超えると切り取られてしまうので、後で追加する予定のものすべてが収まるよう、最初の plot() で xlim = と ylim = を十分に広く設定しておきましょう。
凡例を追加する
グラフに系列が 2 つ以上あるなら、凡例が必要です。legend() は第 1 引数に位置キーワードを取ります — "topright"、"topleft"、"bottomright"、"bottomleft"、"top"、"bottom"、"center"(これらは R の文字列リテラルなので、コード内では英語のままにします) — その後にラベルと対応するスタイルを渡します。
legend("topright",
legend = c("Actual", "Target"),
col = c("steelblue", "gray40"),
lty = c(1, 2),
pch = c(19, NA),
lwd = 2)
col、lty、pch のベクトルは legend と要素ごとに対応していなければなりません。最初のラベルには最初の色、という具合です。ある系列に当てはまらないスタイルには NA を使います(ここでは目標線には点がありません)。キーワードはボックスを作図領域の隅に固定します。データが空けている隅を選びましょう。
複数パネルとファイルへの保存
1 つの図に複数のグラフを表示するには、描く前に作図グリッドを設定します。par(mfrow = c(1, 2)) はデバイスを 1 行 2 列に分割し、続く 2 回の plot() 呼び出しが順にパネルを埋めます。終わったら par(mfrow = c(1, 1)) でリセットしてください。そうしないと以降のグラフが小さいままになります。
ファイルへの保存は、描画を画面ではなく ファイルデバイス に振り向けることで実現します。
png("signups.png", width = 800, height = 600)
plot(x, y, type = "b", pch = 19, col = "steelblue",
main = "Monthly signups", xlab = "Month", ylab = "Signups")
dev.off()
png() と dev.off() の間にあるものはすべてファイルに書き込まれ、画面には何も表示されません。dev.off() を忘れるのが典型的なバグです。デバイスを閉じるまでファイルはロックされたまま空のままになります。pdf()、jpeg()、svg() も同じように動作します。
この章のまとめ
plot(x, y)は即座に描画します。type =で点 ("p")、線 ("l")、両方 ("b") を切り替えます。main、xlab、ylabがグラフにラベルを付けます。colは色名(colors()に 657 個)か 16 進コードを取ります。pch = 19は塗りつぶしの丸です。pch = 21〜25は枠線 (col) と塗り (bg) を分けます。cex、lwd、ltyがサイズと線のスタイルを制御します。points()、lines()、abline()は既存のグラフに重ねます。abline(lm(y ~ x))は 1 回の呼び出しで回帰直線を追加します。legend("topright", ...)が系列にラベルを付け、png(...)+dev.off()がファイルに保存します。
次はヒストグラム — 新しいデータセットに出会ったとき最初に手を伸ばす、1 変数のグラフです。
よくある質問
R でグラフを描くにはどうしますか?
同じ長さの数値ベクトル 2 つを渡して plot(x, y) を呼びます。R はグラフィックスウィンドウを開き、組ごとに点を 1 つ描きます。折れ線グラフにするには type = "l"、タイトルには main、xlab、ylab、色には col を追加します。
R の pch とは何ですか?
pch(plotting character)は点の記号を選ぶ引数で、0 から 25 までの番号が付いています。pch = 19 はほとんどの人が求める塗りつぶしの丸です。21 から 25 の記号は塗りが分離しており、col が枠線、bg が内側の色を設定します。
R のグラフに凡例を追加するにはどうしますか?
グラフを描いた後に legend() を呼びます。第 1 引数に "topright" のような位置キーワード、legend = にラベルのベクトル、そしてグラフで使ったものと同じ col、pch、lty の値を渡します。
R のグラフをファイルに保存するにはどうしますか?
描画前にファイルデバイスを開き、描画後に閉じます: png("myplot.png", width = 800, height = 600) を実行し、グラフのコードを書き、最後に dev.off() を呼びます。画面には何も表示されず、グラフは直接ファイルに書き込まれます。