スタートページ> JavaScript> 他言語> R言語>
Rは、簡単な記述でグラフを描く機能をもっています。下左のようなシンプルなグラフならば、次の plot() だけでよいのです。
x <- c(-2, -1, 1, 3, 5, 6) # X軸の値 y <- c(-1, 3, 1, 4, 3, 5) # Y軸の値 plot(x, y, type='b') # グラフ表示
しかも、多様なオプション機能があり、右上のように加工することもできます。
実際のグラフ作成は、別章で取り扱います。ここでは、そのための基本事項を示すこと、実際に作図するときのリファレンスとして用いることを目的とします。
下記の青線の部分をGoogle Colaboratryの「コード」部分にコピーアンドペースト(ペーストは Cntl+V)して実行すれば、右図の画像が表示されます。
Rでの作図関数は、次の3つに区分されます。
棒グラフ barplot 積上げ棒グラフ barplot 並列棒グラフ barplot 水平棒グラフ barplot ヒストグラム hist 散布図 plot 折線グラフ plot 複数折線グラフ matplot 曲線グラフ curve
ここでは、次のグラフを対象にします。
タイプA:X軸が数値の折線グラフ/散布図(Xデータは不等間隔)
タイプB:国比較のように、X軸が等間隔の折線グラフ
タイプC:棒グラフ/横棒グラフ。X軸目盛りが後述の A, B, … などの要素であるもの
タイプD:棒グラフ/横棒グラフ。X軸目盛りが後述の y1, y2 などの系列であるもの
常識的には、
x <- c(-2, -1, 1, 3, 5, 6) # X軸の値
y <- c(-1, 3, 1, 4, 3, 5) # Y軸の値
のように、点(x,y) の組を与えますが問題があります。
タイプAの折線グラフのように、X軸の値が x の数値が意味がある場合は、これでよいのですが、タイプC・Dの棒グラフの場合は、
x <- c('A','B','C','D','E','F')
のように質的データですので、棒の位置を決定することはできません。それで barplot では、x <- c(1,2, … ) が指示された(x軸非指定)として、棒の位置を等間隔として1.2,… のように連番を付けます。タイプC・Dでは、
names(y) <- c('A','B','C','D','E','F')
複数系列のときは タイプC:colnames(m) <- c("A","B",…)、タイプD:colnames(m) <- c("y1","y2",…)
のようにyデータの付随情報として与えるのです。
折線グラフでも、タイプDでは、国別比較のようにX軸が質的データの場合があります、plot (複数系列のときは matplot)では names として扱う機能をもっていません。そのため plot ではX軸目盛りを非表示にしておき、グラフ作成後に(別途に axis関数を用いて)X軸目盛りを表示する必要があります。
Y軸データが一系列のときは、 y はベクトルであり、縦ベクトルでも横ベクトルでも構いません。
複数系列の場合は、次の考慮が必要になります。
A B C D E F 要素 y1 <- c( 4, 2, 6, 4, 5, 4) 系列 y2 <- c( 5, 6, 4, 5, 3, 5) 系列
上のデータがあるとき、matplot(複数折線グラフ)や barplot(棒グラフ)で matplot(y1,y2,…) のように複数のデータを列挙することはできません。
y1, y2 を二次元配列 m にまとめて matplot(m) としなければなりません。
このとき、結合には2つの形式があります。
タイプC タイプA・B・D 横ベクトルの結合 縦ベクトルの結合 m <- rbind(y1,y2) m <- cbind(y1,y2) y1 y2 y1: 4 2 6 4 5 4 4 5 y2: 5 6 4 5 3 5 2 6 6 4 4 5 5 3 4 5
次のように列ベクトルでもっていることもあります。
m <- matrix(c(-2, -1, # m[1, ] = -2, -1 m[ ,1] = -2, -1, -1, 1, 3, 5, 6 -1, 3, # m[2, ] = -1, 3 m[ ,2] = -1, 3, 1, 4, 3, 5 1, 1, 3, 4, 5, 3, 6, 5), nrow=6, byrow=T) plot(m[ , 1], m[ , 2]) # 正しい barplot(m[ , 1], m[ , 2]) # 期待しないグラフになる
縦ベクトルの結合 m <- cbind(y1,y2) y1 y2 4 5 2 6 6 4 4 5 5 3 4 5 ●個別の横ベクトルで与える x <- c(2, 2.5, 5, 6, 6.5, 8) y1 <- c(4, 2, 6, 4, 5, 4) y2 <- c(5, 6, 4, 5, 3, 5) m <- cbind(y1, y2) # c(y1, y2) は不可 matplot(x, m, type="b", pch=16, cex=2, lty=1, col=c("red", "blue")) ●縦マトリクスで与える x <- c(2, 2.5, 5, 6, 6.5, 8) m <- matrix(c(4, 5, # 縦ベクトル 2, 6, 6, 4, 4, 5, 5, 3, 4, 5), nrow=6, byrow=T) matplot(x, m, type="b", pch=16, cex=2, lty=1, col=c("red", "blue")) ●横マトリクスで与える x <- c(2, 2.5, 5, 6, 6.5, 8) m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), nrow=2, byrow=T) t(m) # m のままだとエラー 転置行列で縦マトリクスに変換 matplot(x, t(m), type="b", pch=16, cex=2, lty=1, col=c("red", "blue")) ●X軸データも横マトリクスで与える m <- matrix(c(2, 2.5, 5, 6, 6.5, 8, 4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), nrow=3, byrow=T) x <- m[1, ] y <- cbind(m[2, ], m[3, ]) matplot(x, y, type="b", pch=16, cex=2, lty=1, col=c("red", "blue")) ●X軸データも縦マトリクスで与える m <- matrix(c(2, 4, 5, 2.5, 2, 6, 5, 6, 4, 6, 4, 5, 6.5, 5, 3, 8, 4, 5), nrow=6, byrow=T) x <- m[ ,1] y <- m[ ,c(2,3)] matplot(x, y, type="b", pch=16, cex=2, lty=1, col=c("red", "blue")) ●データフレームで与える df <- data.frame( # c1 c2 c3 ← 列名 c1 = c(2, 2.5, 5, 6, 6.5, 8), # 1 2 4 5 c2 = c(4, 2, 6, 4, 5, 4), # 2 2.5 2 6 c3 = c(5, 6, 4, 5, 3, 5)) # 3 5 6 4 # 4 6 4 5 # 5 6.5 5 4 # 6 8, 4 5 # └行番号 x <- df$c1 y <- df[c("c2", "c3")] # cbind(df$c2, df$c3) でもよい。c(df$c2, df$c3) ではエラー matplot(x, y, type="b", pch=16, cex=2, lty=1, col=c("red", "blue"))
X軸を与えないで等間隔の折線グラフを描かせ、その後で axis関数によりX軸目盛りを描きます。
●エラー(文法エラー) x <- c("A","B","C","D","E","F") # 質的X軸 y1 <- c( 4, 2, 6, 4, 5, 4) y2 <- c( 5, 6, 4, 5, 3, 5) m <- cbind(y1, y2) matplot(x, m, type="b", # xは非数値などでエラー pch=16, cex=2, lty=1, col=c("red", "blue")) ●エラー(X軸が 1,2, … のまま) y1 <- c( 4, 2, 6, 4, 5, 4) y2 <- c( 5, 6, 4, 5, 3, 5) m <- cbind(y1, y2) colnames=c("A","B","C","D","E","F") # matplot では無意味 matplot(m, type="b", pch=16, cex=2, lty=1, col=c("red", "blue")) ●正しくX軸目盛りを文字にする axis y1 <- c( 4, 2, 6, 4, 5, 4) y2 <- c( 5, 6, 4, 5, 3, 5) m <- cbind(y1, y2) matplot(m, type="b", pch=16, cex=2, lty=1, col=c("red", "blue"), xaxt="n") # 以下でX軸目盛りを設定するので、非表示にする axis(side=1, # X軸を対象 at=c(1:6), # 目盛りを付ける位置(省略時の 1, 2,… の位置) labels=c("A","B","C","D","E","F")) # 目盛り文字列
積上げ棒グラフも並列複数棒グラフも同じです。
横ベクトルの結合 m <- rbind(y1,y2) A B C D E F ← 要素 y1: 4 2 6 4 5 4 ┬─ 系列 y2: 5 6 4 5 3 5 ┘ barplot(m) 積上げ棒グラフ barplot(y, beside=T) 並列棒グラフ barplot(m, byrow=T) 水平積上げ棒グラフ barplot(y, beside=T, byrow=T) 水平並列棒グラフ ● エラー x <- c("A","B","C","D","E","F") y1 <- c( 4, 2, 6, 4, 5, 4) y2 <- c( 5, 6, 4, 5, 3, 5) ・・・ barplot(x, y) # xが数値でないのでエラー ●系列ごとにベクトルで与える y1 <- c( 4, 2, 6, 4, 5, 4) y2 <- c( 5, 6, 4, 5, 3, 5) m <- rbind(y1, y2) # 下記(注)参照 colnames(m) <- c("A","B","C","D","E","F") # colnames(y1) は不可 barplot(m) ----------(注) m <- c(y1, y2) # 12本の棒 m <- cbind(y1, y2) # 2本の棒 X軸は "y1","y2" m <- rbind(y1, y2) # 6本の棒 X軸は表示されない ---------- ●Yデータをマトリクスで与える (Xデータは文字なので、一緒にはできない) m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), nrow=2, byrow=T) colnames(m) <- c("A","B","C","D","E","F") barplot(m) ●データフレームで与える df <- data.frame( # c1 c2 c3 ← 列名 c1 = c("A","B","C","D","E","F"), # 1 A 4 5 c2 = c( 4, 2, 6, 4, 5, 4), # 2 B 2 6 c3 = c( 5, 6, 4, 5, 3, 5)) # 3 C 6 4 # 4 D 4 5 # 5 E 5 4 # 6 F 4 5 # └行番号 m <- rbind(df$c2, df$c3) colnames(m) <- df$c1 barplot(m)
縦ベクトルの結合 m <- cbind(y1,y2) y1 y2 4 5 2 6 6 4 4 5 5 3 4 5
●系列別の横ベクトルで与える y1 <- c( 4, 2, 6, 4, 5, 4) y2 <- c( 5, 6, 4, 5, 3, 5) y <- cbind(y1, y2) barplot(y) ●縦ベクトルのマトリクスで与える m <- matrix(c(4, 5, # 縦ベクトル 2, 6, 6, 4, 4, 5, 5, 3, 4, 5), nrow=6, byrow=T) colnames(m) <- c("y1","y2") barplot(m) ●データフレームで与える df <- data.frame( # c1 c2 c3 ← 列名 c1 = c("A","B","C","D","E","F"), # 1 A 4 5 c2 = c( 4, 2, 6, 4, 5, 4), # 2 B 2 6 c3 = c( 5, 6, 4, 5, 3, 5)) # 3 C 6 4 # 4 D 4 5 # 5 E 5 4 # 6 F 4 5 # └行番号 y <- cbind(df$c2, df$c3) colnames(y) <- c("y1", "y2") barplot(y)
plot() と barplot() の主なオプションを列挙します。グラフの性格上、一方にしか使えないものもありますが、適当に判断してください。
plot(y, オプション) barplot(y, オプション) plot(x,y, オプション) barplot(x,y, オプション)
オプションは、option1=aaa, option=bbb のように与えます。順序は自由です。
例えば棒グラフの色指定のように、複数の要素について指定する場合には option=c(aa1, aa2, …) のようにリスト形式で与えられるオプションもあります。リスト数が少ないときは、リストが繰り返し与えられたことになります。
# 表示範囲 xlim=c(xmin,xmax)、ylim=c(ymin,ymax) 表示範囲の指定 asp=1 目盛り間の縦横比(curveのとき有効) # 点と線 type='p' plotのタイプ: 'p'(点のみ、デフォルト)、'l'(線のみ), 'b' (点と線)、'q'(点と線の重ね書き)、 pch=0 点の形状:□ 1 〇(デフォルト) 2 △ 3 + 4 × 5 ◇ 15 ■ 16 ● 17 ▲ 18 ◆ pch='文字' →散布図での列名の表示 cex=1 点の大きさ col=1 点・線・棒の色 1 'black' rgb(0,0,0), '\#FFFFFF' (デフォルト) 2 'red' 3 'green' 4 'blue' 5 'aqua' 6 'purple' 7 'yeellow' 8 'gray' lty=1 線の形状 1 'solid' 実線(デフォルト) 2 'dashed' 短線 3 'dotted' 点線 3 'dotdash' 鎖線 lwd=1 線の太さ # タイトル グラフの上に表示される main="TITLE", # タイトル cex.main=3, # 文字サイズ col.main="red", # 色 # 軸ラベル xlab='身長', ylab='体重' # 軸ラベル 非表示にするには xlab='' とする cex.lab=2 # 軸ラベルの文字の拡大率 col.lab="blue" font.lab=1 # 軸ラベルのフォント 1 プレーンテキス 2 ボールド 3 イタリック 4 ボールドイタリック # 軸の目盛り y=0, x=0 の線ではなく、グラフの下・左に表示される。負のデータがあるときに注意 cex.axis=1.5, # 軸目盛りの文字の拡大率 col.lab="blue" xaxt='n', yaxt='n' # 軸目盛の非表示
x <- c(-2, -1, 1, 3, 5, 6) # X軸の値 y <- c(-1, 3, 1, 4, 3, 5) # Y軸の値 plot(x, y, type='b', # 折線グラフ xlim=c(-4, 8), # 表示範囲 ylim=c(-2, 6), # pch=2, # 点は△ cex=4, # 点のサイズ col='red', # 点の色 lty=1, # 線は実線 lwd=2, # 線の太さ cex.lab=2, # 軸ラベルの大きさ(拡大率) cex.axis=1.5, # 軸見出しの大きさ col.lab="blue", # 軸ラベルの色 xlab='x-axis', # X軸 ylab='y-axis' # Y軸 )
日本語の表示をする方法もあるらしいのですが、どうもうまくいきませんでした。
低水準作図関数とは、高水準作図関数で作成したグラフの体裁を整える機能を提供します。その主なものを掲げます。
ここでのオプションは、高水準作図関数のオプションと共通しているものが多いです。例えば線を引く関数のパラメタでは、lty(線のタイプ)、lwd(線の太さ)、col(線の色)などが指定できますし、文字に関する関数では、pch(文字の大きさ)、cex(文字の拡大率)、col(色)、font(フォント)などが指定できます。
ここでは、主に関数独自のオプションを示します。また、用途により分類していますので、同じ関数が散在して出現することがあります。
説明はかなり舌足らずです。ひな形を下記の青線の部分をGoogle Colaboratryの「コード」部分にコピーアンドペースト(ペーストは Cntl+V)して実行すれば、表示した画像が表示されます。それを適宜変更して確認してください。ベースは範囲だけをで何のグラフもない
plot(c(-2, 6), c(-1, 5), type="n", xlab="", ylab="")
を設定しています。
# 〓〓〓 グラフ全体 box(lwd=2, fill=T, col="gray") # 図形領域をgrayで塗りつぶす # 注意:グラフ作成以前に指定する par(new=T) # グラフ作成で消去されっるのを防ぐ # 〓〓〓 線 # 格子線 # 格子線だけを引く(軸線参照) abline(h=seq(ymin, ymax, dy), # 等間隔にX軸の平行線 グラフ下の目盛りは消える lty="dotted", # 点線 col="gray") # 灰色 # グラフ下(X軸ではない)に目盛りも書き込む axis(side=1, # 1 水平線 2 垂直線 at=seq(xmin, xmax, dx), # 目盛り点の設定 abline とは x-yが異なる lty="dotted", # 点線 col="gray") # 灰色 # 軸線 axis(side=1,… ) # 軸線を引く side=1 X軸、2 Y軸 abline(h=y,… ) # y=0 ならX軸、値を変えることによりX軸の平行線 abline(v=x,… ) # x=0 ならY軸、値を変えることによりY軸の平行線 axis(side=1, at=seq(xmin, xmax, dx), # at は目盛り点の設定 pos=0, # y=0 にX軸を引く lwd=2, # 軸線の太さ col="blue", # 軸線の色 cex.axis=1.5, # 目盛りの拡大率 col.axis="blue" # 目盛りの色 las=0) # 目盛りの表示方向 X軸なら省略、Y軸なら2が一般的 # 0 各軸に並行、1 すべて水平、2 軸に垂直、3 すべて垂直 # 任意の直線 segments(x0,y0, x1,y1) # (x0,y0) と (x1,y1) を結ぶ線分 arrows(x0,y0, x1,y1) # 矢印 lines(x=c(x1, x2, … ), # (x1,y1) - (x2,y2) - の点を折線で結合 y,c(y1, y2, … ), lwd, ity ) abline(b,a) # y=ax+b の線
plot(c(-2, 6), c(-1, 5), type="n", xlab="", ylab="") # 格子線 axis(side=1, # 水平線 at=seq(-2, 6, 1), # 目盛り点の設定 lty="dotted", # 点線 col="gray") # 灰色 axis(side=2, # 垂直線 at=seq(-2, 6, 1), lty="dotted", col="gray") # 軸線 abline(h=0, # X軸 lwd=2, # 線の太さ col="blue") # 線の色 abline(v=0, # Y軸 lwd=2, col="blue") # 任意の直線 lines(x=c(-1, 5), y=c(-1, 5), lwd=4, col="red")
ここでの軸ラベルや軸目盛りは plot関数のオプションとしても設定できます。ここで軸ラベルや軸目盛りを設定する場合、plot関数でそれらを表示していると重ねて表示されるので、plot でのオプションで、xlab='' や yaxt='n' のように、これらを非表示にする必要があります。
# 〓〓〓 文字 # タイトルと軸ラベル title(main="タイトル", # 上部余白に表示 col.main="red", # タイトルの色 cex.main=4, # タイトルの色 sub="サブタイトル", # 下部余白に表示 xlab="X軸ラベル", ylab="y軸ラベル", cex.lab=2) # 軸ラベルの拡大率 # 軸目盛り(軸と重複) # 軸と目盛りだけ axis(side=1, # 1 X軸、2 Y軸 at=seq(xmin, xmax, dx), # pos=0) # 軸の位置 # 格子線も引く(格子線と重複) axis(side=1, at=seq(xmin, xmax, dx), tcl=1, pos=0) # 任意位置の文字列挿入 text(x,y, 文字列, pos=1, # (x,y) からの相対位置 1=下, 2=左, 3=上, 4=右 offset=2, # その微調整 srt=30, # 角度 水平なら省略 col="red", cex=2) # 色や大きさなど
plot(c(-2, 6), c(-1, 5), type="n", xlab="", ylab="", xaxt="n", yaxt="n") # 軸グラフと軸目盛りを非表示にした # 格子線だけを引く abline(h=seq(-1, 5, 1), lty="dotted") abline(v=seq(-2, 6, 1), lty="dotted") # 軸目盛り axis(side=1, # X軸目盛り at=seq(-2, 6, 1), # xmin, xmax. dx pos=0, # y=0 をX軸とする cex.axis = 1.5, # 目盛り文字の大きさ1.5倍(Y軸目盛りと比較せよ) col.axis="blue") axis(side=2, # Y軸目盛り at=seq(-1, 5, 1), # ymin, ymax. dy pos=0, # x=0 をY軸とする col="blue") # タイトルと軸ラベル title(main="title", # タイトル グラフ上に表示 col.main="red", # 文字の色 cex.main=4, # 文字の大きさ xlab="x-axis", # X軸ラベル ylab="y-axis", # Y軸ラベル cex.lab=2) # 任意位置の文字列挿入 text(0,4, "aaaaa", cex=2) # 点が文字の中心 text(0,3, "bbbbb", cex=2, pos=1) # 点の下側 text(4,3, "ccccc", cex=2, pos=2) # 点の左側 text(0,2, "ddddd", cex=2, pos=3) # 点の上側 text(4,2, "eeeee", cex=2, pos=4) # 点の右側 text(0,1, "fffff", cex=2, pos=1, offset=2) # 点の下に2だけあけた下側 text(4,1, "ggggg", cex=2, pos=2, offset=2) # 点の左に2だけあけた左側
グラフに図形を書きこむとき、地のグラフが図形の裏になります。それでは不都合で防ぐには、
まず、plot(c(-2, 6), c(-1, 5), type="n", xlab="", ylab="", xaxt="n", yaxt="n") のようにサイズだけを指定したグラフを作る。
次に、この図形表示や線・文字を書き込む。この順はどちらが全面になるかによる。
これに本来のグラフを重ねるために、 par(new=T) を指定します。
本来のグラフを描きます。
# 〓〓〓 図形 # 点 points(x,y, type="p", plotの点のパラメタに準ずる) # 矩形 rect(x0,y0, x1,y1. border="black", # 枠線の色 col="red") # 塗りつぶしの色 # 多角形 polygon(x=c(x1,x2,…), y=c(y1,y2,…), 矩形のパラメタに準ずる)
plot(c(-2, 6), c(-1, 5), type="n", xlab="", ylab="") # 格子線 axis(side=1, at=seq(-2, 6, 1), lty="dotted") axis(side=2, at=seq(-1, 5, 1), lty="dotted") # 点 points(-1,4, type="p") # デフォルト points(3,4, type="p", pch=15, # ■ cex=4, # 点の拡大率 col="red") # 点の色(□なら塗りつぶしなし) # 矩形 rect(-1,3, 1,2) # デフォルト rect(3,3, 5,2, border="blue", # 枠の色 col="yellow") # 塗りつぶしの色 # 多角形 polygon(x=c(-1,1,0), y=c(1,1,0)) # デフォルト polygon(x=c(3,5,4), y=c(1,1,0), border="blue", col="yellow")
plot や barplot などの内部で凡例の記述ができます。手軽ですが、細かい指定はできません。
# 凡例 legend() 関数 legend("topleft", # 表示位置 下記参照 ncol=2 # 1行に表示する系列数 省略時は1 legend=c("系列1", … ), # 凡例の系列の名称(配列) text.col=c("red", … ), # 凡例の文字色(text.cex はエラーになる) cex=2, # 凡例内全体(文字や線)拡大率(ptも含む) # (後に pt.cex で点の大きさを指定するので文字列だけに適用) pch=c(1, … ), # 点の形 matplot で指定したのと同じにする # (棒グラフのときは pch=15 ■で軸の代用にする) lty=c(1, … ), # 線の形 棒グラフでは不要 matplot で指定したのと同じにする col=c("red","blue"), # 点・線の色 matplot で指定したのと同じにする pt.cex=2 # 凡例内の点だけの拡大率 text.width=1.5 # 凡例内の文字部分の幅拡大 bty = "n" # 凡例枠線を非表示 box.lwd=3, # 凡例枠線の太さ box.lty=3, # 枠線のタイプ box.col="green", # 枠線の色 bg="yellow") # 凡例領域の背景 # 表示位置 # "topleft" "top" "topright" # "left" "center" "right" # "bottomleft" "bottom" "bottomright"
# 入力データ x <- c(-2, -1, 1, 3, 5, 6) # X軸の値 ya <- c(-1, 3, 1, 4, 3, 5) # Y軸 A系列 yb <- c( 3, 5, 2, 0, 2, 4) # Y軸 B系列 y <- cbind(ya, yb) # グラフ matplot(x, y, type="b", col=c("red","blue"), # ┐ pch=c(15, 16), # │ cex=c(2, 3), # ├ 一致 lty=1, # │ lwd=c(2, 4)) # ┘ # 凡例 legend("bottomright", # 表示位置 legend=c("ya", "yb"), # 系列文字列 cex=1.5, # とりあえず全体の拡大(結果は文字列だけに適用) text.col="black", # 文字列の色 col=c("red","blue"), # ┐ pch=c(15, 16), # │ pt.cex=c(2, 3), # ├ 一致(文字への適用を防ぐために pt.を付ける)) lty=1, # │ lwd=c(2, 4)) # ┘
# 入力データ x <- c(-2, -1, 1, 3, 5, 6) # X軸の値 ya <- c(-1, 3, 1, 4, 3, 5) # Y軸 A系列 yb <- c( 3, 5, 2, 0, 2, 4) # Y軸 B系列 y <- cbind(ya, yb) # グラフ matplot(x, y, type="b", col=c("red","blue"), pch=c(15, 16), cex=c(2, 3), lty=1, lwd=c(2, 4)) # 凡例 legend("bottomright", legend=c("ya", "yb"), cex=1.5, text.col="black", col=c("red","blue"), pch=c(15, 16), pt.cex=c(2, 3), lty=1, lwd=c(2, 4), #ここまでは前と同じ 以降を追加 box.lwd=2, # 凡例枠線の太さ box.lty=1, # 枠線のタイプ box.col="green", # 枠線の色 bg="yellow") # 凡例領域の背景
積上げ棒グラフでは、グラフの順序と凡例の順が逆になります。series2 のほうを前にしたほうがよいでしょう。
m <- matrix(c(4, 2, 6, 4, 5, 4, # series1 5, 6, 4, 5, 3, 5), # series2 ncol=6, byrow=T) colnames(m) <- c("c1","c2","c3","c4","c5","c6") barplot(m, col=c("red","blue")) # 凡例 legend("bottomright", legend=c("series1", "series2"), cex=2, # 凡例全体の拡大率 text.col="black", pch=15. # 軸を■で代用 col=c("red","blue"))
グラフの外側に余白を確保する必要があります。 グラフを作成する前に宣言します。 par(mar=c(10,1,4,13)) # グラフ外側の余白:底辺,左側,上側,右側の順 グラフの外側に表示することを許す必要があります。 グラフ作成後、凡例を作成する前に記述します。 par(xpd=TRUE) 凡例の左上をグラフ枠との位置で指定できます。 par()$usr[p]+n # p:グラフ枠 1 左、2 右、3 下、4 上 # n:補正:上・右への変位 # 例 par()$usr[2]+0.5, par()$usr[3]+1, # par()$usr[3]+1, par()$usr[2]+0.5, としても同じ # グラフの右・下端から、右に0.5、上に1移動した点に凡例の左上端を合わせる
例示
par(mar=c(10,1,4,13)) # グラフ外側の余白:底辺,左側,上側,右側の順 plot(0,0, xlim=c(1,5), ylim=c(1,5)) par(xpd=TRUE) # グラフの外側の表示を許す legend(par()$usr[1], par()$usr[3], legend="legend(1,3)") legend(par()$usr[1], par()$usr[4], legend="legend(1,4)") legend(par()$usr[2], par()$usr[3], legend="legend(2,3)") legend(par()$usr[2], par()$usr[4], legend="legend(2,4)") legend(par()$usr[1], par()$usr[3]-0.5, legend="legend(1,3-0.5)") legend(par()$usr[1], par()$usr[4]+0.5, legend="legend(1,4+0.5)") legend(par()$usr[2]+0.5, par()$usr[3]+1, legend="legend(2+0.5,3+1)")
冒頭に掲げた「簡単な例」を、いろいろなオプションで体裁を整えます。しかし「凝った」ものではなく、通常行うような程度にします。
パラメタを変えて試してください。
x <- c(-2, -1, 1, 3, 5, 6) # X軸の値 y <- c(-1, 3, 1, 4, 3, 5) # Y軸の値 # 折線グラフ plot(x, y, type='b', # 折線グラフ pch=16, # 点の形状 ● cex=2, # 点の大きさ col="red", # 点・線の色 lty=1, # 線は実線 lwd=2, # 線の太さ main="TITLE", # タイトル cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # 軸ラベル ylab="y-axis", cex.lab=2, # 文字拡大率 col.lab="blue", xaxt="n", # 目盛り グラフの下(X軸ではない)に表示されるのを非表示にする yaxt="n") # 格子線 abline(h=seq(-1, 5, 1), # 目盛り点の設定 lty="dotted") # 点線 abline(v=seq(-2, 6, 1), lty="dotted") # 軸線 axis(side=1, # X軸 pos=0, # y=0 の位置 at=seq(-2,6,1), # xmin, xmax, dx lwd=2, # 軸の太さ col="blue", # 軸の色 cex.axis=1.5, # 目盛り文字拡大率 col.axis="blue") # 目盛り文字の色 axis(side=2, pos=0, at=seq(-1,5,1), las=2, lwd=2, col="blue", cex.axis=1.5, col.axis="blue") # 凡例 legend("bottomright", # 凡例を右下に表示 legend="y", # 系列名 pch=16, # 点の形状 ┐ lty=1, # 線のタイプ ├ plot での設定と同じにする col="red", # 線・点の色 ┘ cex=1.5) # 凡例全体の拡大率 # 任意の直線 lines(x=c(-2,6),y=c(0,4), # 斜めの点線 lwd=4, # 線の太さ lty="dotted") # 線のタイプは点線 # 任意文字列 text(3,2, # 斜めの文字列 "Regression Line", # 文字列 cex=1.5, # 文字拡大率 srt=30) # 角度