スタートページ> JavaScript> 他言語> R言語> ←グラフ(リファレンス)
典型的なグラフの様式に関して「通常の体裁」のグラフ作図コーディング例を示します。
x <- c(2, 2.5, 5, 6, 6.5, 8) y <- c(4, 2, 6, 4, 5, 4) plot(x, y, pch=16, # 点の形状 cex=2, # 点の大きさ col="red", # 点の色 main="scat11", # タイトル cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # 軸ラベル ylab="y-axis", cex.lab=2, # 文字拡大率 col.lab="blue") abline(h=seq(2, 6, 0.5), lty="dotted") # 格子線 abline(v=seq(2, 8, 0.5), lty="dotted") axis(side=1, at=seq(2,8,1), cex.axis=1.5) axis(side=2, at=seq(2,6,1), cex.axis=1.5, las=2) # Y目盛りを水平に
matplot では x は横ベクトル、y は系列別の列ベクトルになっている必要があります。
x <- c(2, 2.5, 5, 6, 6.5, 8) # 横ベクトル y <- matrix(c(4, 5, # 縦ベクトル 2, 6, 6, 4, 4, 5, 5, 3, 4, 5), nrow=6, byrow=T) matplot(x, y) # 点はデフォルト指定(1,2、…になる) abline(h=seq(2, 7, 1), lty="dotted") abline(v=seq(0, 8, 1), lty="dotted")
さらに点の指定オプションを加えた
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) y <- matrix(0,6,2) # 縦ベクトルに変換(全ての要素が0) y[ ,1] <- y1 y[ ,2] <- y2 matplot(x, y[ ,1:2], # 点 pch=c(0,15), col=c("red","blue"), # 点の形状と色:個別に与えた cex=2, # 点の拡大率:共通に与えた main="scat22", # タイトル cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # 軸ラベル ylab="y-axis", cex.lab=2, # 文字拡大率 col.lab="blue", # 色 xaxt="n", # 目盛り 後で設定するので非表示にする yaxt="n") abline(h=seq(2, 6, 0.5), lty="dotted") # 格子線 abline(v=seq(2, 8, 0.5), lty="dotted") axis(side=1, at=seq(2,8,1), cex.axis=1.5) # 目盛り axis(side=2, at=seq(2,6,1), cex.axis=1.5, las=2) # Y目盛りを水平に
入力データがデータフレームのときはさらに簡単です。
# x y 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 3 # 6 8 4 5 # └行番号 x <- df$c1 # これで x は横ベクトルになる y <- df[c("c2","c3")] # 2系列の縦ベクトルになる matplot(x, y, # これだけでよい … )
折線グラフは、散布図に type="b" を付加して、必要に応じて線に関するオプションを設定するだけです。散布図の部分を参照してください。
x <- c(2, 2.5, 5, 6, 6.5, 8) y <- c(4, 2, 6, 4, 5, 4) plot(x, y, type="b", # 折線ブラフ pch=16, # 点の形状 cex=2, # 点の大きさ col="red", # 点・線の色 # 線 lty=1, # 線は実線 lwd=2, # 線の太さ main="plot11", # タイトル cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # 軸ラベル ylab="y-axis", cex.lab=2, # 文字拡大率 col.lab="blue", xaxt="n", # 目盛り 後で設定するので非表示にする yaxt="n") abline(h=seq(2, 6, 0.5), lty="dotted") # 格子線 abline(v=seq(2, 8, 0.5), lty="dotted") axis(side=1, at=seq(2,8,1), cex.axis=1.5) # 目盛り axis(side=2, at=seq(2,6,1), cex.axis=1.5, las=2) # Y目盛りを水平に
上のグラフは y=2 (最小値)から上の部分ですが、y=0 を基準にしたことが多くあります。
これは単純で ylim=c(ymin, ymax) を追加するだけです。
x <- c(2, 2.5, 5, 6, 6.5, 8) y <- c(4, 2, 6, 4, 5, 4) plot(x, y, type="b", ylim=c(0,6), # 範囲指定 pch=16, cex=2, col="red", lty=1, lwd=2, main="plot12", cex.main=3, col.main="red", xlab="x-axis", ylab="y-axis", cex.lab=2, col.lab="blue", xaxt="n", yaxt="n") abline(h=seq(0, 6, 0.5), lty="dotted") # 0から abline(v=seq(2, 8, 0.5), lty="dotted") axis(side=1, at=seq(2,8,1), cex.axis=1.5) axis(side=2, at=seq(0,6,1), cex.axis=1.5, las=2) # 0から
xやyに負の値があるとき、原点(0,0)がグラフの中になるので、それを基準にしてX・Y軸を引き、目盛りもそこに書くのが普通です。
x <- c(-1,-0.5, 2, 3, 3.5, 5) y <- c(1, -1, 3, 1, 2, 1) plot(x, y, type="b", pch=16, cex=2, col="red", lty=1, lwd=2, main="plot13", cex.main=3, col.main="red", xlab="x-axis", ylab="y-axis", cex.lab=2, col.lab="blue", xaxt="n", yaxt="n") abline(h=seq(-2, 4, 0.5), lty="dotted") abline(v=seq(-2, 6, 0.5), lty="dotted") # 原点設定での変更箇所 axis(side=1, at=seq(-2,6,1), cex.axis=1.5, pos=0, # y=0 の位置 lwd=2, # 軸の太さ col="blue", # 軸の色 cex.axis=1.5, # 目盛り文字拡大率 col.axis="blue") # 目盛り文字の色 axis(side=2, at=seq(-2,5,1), cex.axis=1.5, pos=0, lwd=2, col="blue", cex.axis=1.5, col.axis="blue", las=2)
polygon(多角形)を使います 折線データと y=ymin で囲まれた図形は、 (x1,ymin) →(x1,y1) →(x1,y1)→…→(xn,yn)→(xn,ymin)→(x1,ymin) なので、 xp <- c(x1, x, xn, x1) yp <- c(ymin, y, ymin, ymin) polygon(xp, yp, border="red", # 枠の色 col=yellow") # 塗りつぶしの色 とすればよいでしょう。
x <- c(2, 2.5, 5, 6, 6.5, 8) y <- c(4, 2, 6, 4, 5, 4) plot(x, y, type="l", # 折線ブラフ pch=16, # 点の形状 cex=2, # 点の大きさ col="red", # 点・線の色 # 線 lty=1, # 線は実線 lwd=2, # 線の太さ main="plot14", # タイトル cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # 軸ラベル ylab="y-axis", cex.lab=2, # 文字拡大率 col.lab="blue", xaxt="n", # 目盛り 後で設定するので非表示にする yaxt="n") # 追加した部分 ymin <- 3 xp <- c(x[1], x, x[6], x[1]) yp <- c(ymin, y, ymin, ymin) polygon(xp, yp, col="yellow") # 塗りつぶしの色 abline(h=seq(2, 6, 0.5), lty="dotted") # 格子線 abline(v=seq(2, 8, 0.5), lty="dotted") axis(side=1, at=seq(2,8,1), cex.axis=1.5) # 目盛り axis(side=2, at=seq(2,6,1), cex.axis=1.5, las=2) # Y目盛りを水平に
例えば、年度での推移のように、X軸が等間隔になる場合です。
x <- c(2010, 2011, 2012, 2013, 2014, 2015) とすれば、plot11 と同じにできますし、 x <- c(2010:2015) として与えることもできます。 また、国別比較のように、xが質的データの場合もあります。 x <- c("A", "B", "C", "D", "E", "F") とすればよいのでしょうが、これではX軸のスケールがわかりません。 そのため、x軸を与えず(デフォルトで1,2、…)としてグラフを描き、 事後に「軸目盛りの設定」で、xを与えるようにします。 plot11 と # の部分を変えるだけです。
x <- c("A", "B", "C", "D", "E", "F") # 質的データ y <- c( 4, 2, 6, 4, 5, 4) plot(y, type="b", # x を与えない(等間隔の6点) pch=16, cex=2, col="red", lty=1, lwd=2, main="plot15", cex.main=3, col.main="red", xlab="x-axis", ylab="y-axis", cex.lab=2, col.lab="blue", xaxt="n", yaxt="n") abline(h=seq(2, 6, 0.5), lty="dotted") abline(v=c(1:6), lty="dotted") # 6本の縦の線(整数に決まっている) axis(side=1, at=c(1:6), labels=x, cex.axis=1.5) # labelsで文字のX軸目盛りを指定 axis(side=2, at=seq(2,6,1), cex.axis=1.5, las=2)
# x y df <- data.frame( # c1 c2 ← 列名 c1 = c("A","B","C","D","E","F"), # 1 A 4 c2 = c( 4, 2, 6, 4, 5, 4)) # 2 B 2 # 3 C 6 # 4 D 4 # 5 E 5 # 6 F 4 # └行番号 x <- df$c1 y <- df$c2 以下は plot15 と同じです。結果のグラフも同じです。
xは横ベクトル、yは複数系列からなる縦ベクトルです。
基本的には、複数系列の散布図に type="b" を付加して作図できます。その部分を参照してください。
x <- c(2, 2.5, 5, 6, 6.5, 8) # 横ベクトル y <- matrix(c(4, 5, # 縦ベクトル 2, 6, 6, 4, 4, 5, 5, 3, 4, 5), nrow=6, byrow=T) matplot(x, y, type="b", pch=16, # 点の形状 cex=2, # 点の大きさ col=c("red", "blue"), # 点・線の色 # 線 lty=1, # 線は実線 lwd=c(2,4), # 線の太さ main="matplot11", # タイトル cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # 軸ラベル ylab="y-axis", cex.lab=2, # 文字拡大率 col.lab="blue", xaxt="n", # 目盛り 後で設定するので非表示にする yaxt="n") abline(h=seq(2, 6, 0.5), lty="dotted") # 格子線 abline(v=seq(2, 8, 0.5), lty="dotted") axis(side=1, at=seq(2,8,1), cex.axis=1.5) # 目盛り axis(side=2, at=seq(2,6,1), cex.axis=1.5, las=2) # Y目盛りを水平に
データフレームで与えるのがおすすめです。結果は上と同じです。
# x y 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 3 # 6 8 4 5 # └行番号 x <- df$c1 # これで x は横ベクトルになる y <- df[c("c2","c3")] # 2系列の縦ベクトルになる matplot(x, y, type="b", # これだけでよい。以降は上と同じ … )
単純に y1 と y3 <- y1+y2 のグラフにすればよいでしょう。
# x y 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 3 # 6 8 4 5 # └行番号 x <- df$c1 # これで x は横ベクトルになる df$c4 <- df$c2 + df$c3 y <- df[c("c2","c4")] # 2系列の縦ベクトルになる matplot(x, y, type="b", # これだけでよい。以降は上と同じ pch=16, # 点の形状 cex=2, # 点の大きさ col=c("red", "blue"), # 点・線の色 # 線 lty=1, # 線は実線 lwd=c(2,4), # 線の太さ main="matplot12", # タイトル cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # 軸ラベル ylab="y-axis", cex.lab=2, # 文字拡大率 col.lab="blue", xaxt="n", # 目盛り 後で設定するので非表示にする yaxt="n") abline(h=seq(2, 10, 1), lty="dotted") # 格子線 abline(v=seq(2, 8, 0.5), lty="dotted") axis(side=1, at=seq(2,8,1), cex.axis=1.5) # 目盛り axis(side=2, at=seq(2,10,1), cex.axis=1.5, las=2) # Y目盛りを水平に
「積上げ折線グラフ(matplot11)」と「折線グラフの下を塗りつぶす (plot14.png)」を組み合わせます。
下のグラフは、plot14.png と同じですが、上のグラフは ymin が下のグラフの y と ymin の大に値になります。全てのグラフに関して単純に、plot14.png のように ymin との間を塗りつぶすこともできます。この場合は、必ず上のグラフから塗りつぶすこと、下のグラフの折線が隠れてしまうので、下のグラフの枠線の色を折線の色と太さに指定する必要があります。
ここでは後者の方法を用います。
# 入力データ # x y 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 3 # 6 8 4 5 # └行番号 # y1+y2 ベクトルの作成 x <- df$c1 # これで x は横ベクトルになる df$c4 <- df$c2 + df$c3 y <- df[c("c2","c4")] # 2系列の縦ベクトルになる # グラフ作図 matplot(x, y, type="l", # これだけでよい。以降は上と同じ pch=16, # 点の形状 cex=2, # 点の大きさ col=c("red", "blue"), # 点・線の色 # 線 lty=1, # 線は実線 lwd=c(2,4), # 線の太さ main="matplot13", # タイトル cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # 軸ラベル ylab="y-axis", cex.lab=2, # 文字拡大率 col.lab="blue", xaxt="n", # 目盛り 後で設定するので非表示にする yaxt="n") # 塗りつぶし ymin <- 3 xp <- c(x[1], x, x[6], x[1]) # 上グラフの塗りつぶし yp <- c(ymin, y[ ,2], ymin, ymin) polygon(xp, yp, col="yellow") # 下グラフの塗りつぶし yp <- c(ymin, y[ ,1], ymin, ymin) polygon(xp, yp, border="red", # 枠の色(下のグラフの線に合わせる) lwd=2, # 線の太さ col="green") # 塗りつぶしの色 # 体裁 abline(h=seq(2, 10, 1), lty="dotted") # 格子線 abline(v=seq(2, 8, 0.5), lty="dotted") axis(side=1, at=seq(2,8,1), cex.axis=1.5) # 目盛り axis(side=2, at=seq(2,10,1), cex.axis=1.5, las=2) # Y目盛りを水平に # 凡例 legend("bottomright", legend=c("y2", "y1"), # グラフの順序に合わせる pch=15, # 領域を■で代用 col=c("yellow","green"), cex=1.5) # 凡例全体の拡大率
折線グラフのように、 x <- c( … ) y <- c( … ) barplot(x,y,… ) としたのではうまくいきません。 Yデータだけでグラフを描き、name(y) でXデータを与えます。
すべてをデフォルト指定にしたグラフです。
y <- c( 2, 4, 5, 3, 6, 4) names(y) <- c("A","B","C","D","E","F") # X軸の表示文字列 barplot(y)
barplot11 と同じ結果になります。 # x y df <- data.frame( # c1 c2 ← 列名 c1 = c("A","B","C","D","E","F"), # 1 A 4 c2 = c( 4, 2, 6, 4, 5, 4)) # 2 B 2 # 3 C 6 # 4 D 4 # 5 E 5 # 6 F 4 # └行番号 y <- df$c2 names(y) <- df$c1 barplot(y)
時系列データのように、X軸が数値の場合は次のようにします。 y <- c( 2, 4, 5, 3, 6, 4) names(y) <- c(2010:2015) # 2010,2011, … ,2015 になります。 barplot(y)
y <- c( 2, 4, 5, 3, 6, 4) # Yのデータ names(y) <- c("A","B","C","D","E","F") # X軸の表示文字列 barplot(y, # 棒グラフ col=c("red","green","blue"), # 棒の色。指定数が少ないときは繰り返す xlab = "item", ylab = "y", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 cex.names=1.5, # X軸目盛り(names(y))の文字拡大率 yaxt="n", # Y軸目盛りは、axis で指定するので非表示にする main="barplot12", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(h=seq(0, 8, 0.5), # Yの補助線(Xの補助線は不要でしょう) lty="dotted", # 点線 col="black") # 色 axis(side=2, # Y軸の目盛り(X軸の目盛りは barplot 内で設定) at=seq(0,6,1), # 目盛りの刻み cex.axis=1.5, # 文字拡大率 las=2) # 目盛りの文字を水平にする box() # グラフ枠(デフォルトでは上・右の線がない)
space=c(1,3,…) # 棒間の間隔 space=0 # 棒が密着(ヒストグラム) col=c("red","blue",…) # 棒の色 width=c(1,3,…) # 棒の相対的幅(同一のときは無意味) border=c("red","blue",…) # 棒の枠線の色 border=F # 枠線なし
y <- c( 2, 4, 5, 3, 6, 4) # Yのデータ names(y) <- c("A","B","C","D","E","F") # X軸の表示文字列 barplot(y, # 棒グラフ # 変更部分 space=0, # 棒間隔 0にときヒストグラム width=c(1,2), # 棒の太さ(個々に異なるときだけ有効) border="blue", # 棒の枠の色 col=c("red","green","blue"), # 棒の色。指定数が少ないときは繰り返す # 以下は同じ xlab = "item", ylab = "y", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 cex.names=1.5, # X軸目盛り(names(y))の文字拡大率 yaxt="n", # Y軸目盛りは、axis で指定するので非表示にする main="barplot13", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(h=seq(0, 8, 0.5), # Yの補助線(Xの補助線は不要でしょう) lty="dotted", # 点線 col="black") # 色 axis(side=2, # Y軸の目盛り(X軸の目盛りは barplot 内で設定) at=seq(0,6,1), # 目盛りの刻み cex.axis=1.5, # 文字拡大率 las=2) # 目盛りの文字を水平にする box() # グラフ枠(デフォルトでは上・右の線がない)
データは次の形式で与えるのが便利です。
m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), ncol=6, byrow=T) colnames(m) <- c("c1","c2","c3","c4","c5","c6") # c1 c2 c3 c4 c5 c6 ← X軸 # 4 2 6 4 5 4 ← Y1 ベース # 5 6 4 5 3 5 ← Y2 上に積上げ barplot(m, col=c("red","blue"), # 棒の色。指定数が少ないときは繰り返す xlab = "item", ylab = "y", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 cex.names=1.5, # X軸目盛り(c1, c2 など) yaxt="n", # Y軸目盛りは、axis で指定するので非表示にする main="barplot21", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(h=seq(0, 10, 1), # Yの補助線(Xの補助線は不要でしょう) lty="dotted", # 点線 col="black") # 色 axis(side=2, # Y軸の目盛り(X軸の目盛りは barplot 内で設定) at=seq(0,10,1), # 目盛りの刻み cex.axis=1.5, # 文字拡大率 las=2) # 目盛りの文字を水平にする # 凡例 legend("bottomright", legend=c("y2", "y1"), # グラフの順序に合わせる pch=15, # 棒を■で代用 col=c("blue","red"), cex=1.5) # 凡例全体の拡大率 box() # グラフ枠(デフォルトでは上・右の線がない)
barplot21 の m を行・列を入れ替えた転置行列 t(m) にして、X軸目盛りの部分を追加します。
m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), ncol=6, byrow=T) # colname(m)は不要 par(mar=c(5, 5, 5, 15)) # グラフ外側の余白:底辺,左側,上側,右側の順 barplot(t(m), col=c("red","green","blue"), # 棒の色。指定数が少ないときは繰り返す xlab = "series", ylab = "y", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 cex.names=1.5, # X軸目盛り(c1, c2 など) yaxt="n", # Y軸目盛りは、axis で指定するので非表示にする main="barplot22", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(h=seq(0, 30, 5), # Yの補助線(Xの補助線は不要でしょう) lty="dotted", # 点線 col="black") # 色 axis(side=1, # X軸の目盛り at=c(1:2), # 目盛り位置 labels=c("series1","series2"), # 目盛りの名称 cex.axis=1.5) # 目盛り文字拡大率 axis(side=2, # Y軸の目盛り(X軸の目盛りは barplot 内で設定) at=seq(0,30,5), # 目盛りの刻み cex.axis=1.5, # 文字拡大率 las=2) # 目盛りの文字を水平にする par(xpd=TRUE) # グラフの外側の表示を許す legend(par()$usr[2], par()$usr[4], # 凡例の表示位置 legend=c("c6","c5","c4","c3","c2","c1"), # グラフの上下順に合わせる pch=15, col=c("blue","green","red"), # 記号の色 cex=1.5) # 凡例全体の拡大率 box() # グラフ枠(デフォルトでは上・右の線がない)
m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), ncol=6, byrow=T) colnames(m) <- c("c1","c2","c3","c4","c5","c6") # c1 c2 c3 c4 c5 c6 ← X軸 # 4 2 6 4 5 4 ← Y軸 ベース # 5 6 4 5 3 5 ← Y軸 上に積上げ barplot(m, beside=T, # 並列棒グラフ col=c("red","blue"), # 棒の色。指定数が少ないときは繰り返す xlab = "item", ylab = "y", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 cex.names=1.5, # X軸目盛り(c1, c2 など) yaxt="n", # Y軸目盛りは、axis で指定するので非表示にする main="barplot23", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(h=seq(0, 6, 0.5), # Yの補助線(Xの補助線は不要でしょう) lty="dotted", # 点線 col="black") # 色 axis(side=2, # Y軸の目盛り(X軸の目盛りは barplot 内で設定) at=seq(0,6,1), # 目盛りの刻み cex.axis=1.5, # 文字拡大率 las=2) # 目盛りの文字を水平にする legend("topright", # 表示位置 下記参照 ncol=2, # 1行に表示する系列数 legend=c("y1", "y2"), # グラフの順序に合わせる pch=15, # 棒を■で代用 col=c("red","blue"), cex=1.5) # 凡例全体の拡大率 box() # グラフ枠(デフォルトでは上・右の線がない)
barplot23 の m を行・列を入れ替えた転置行列 t(m) にして、X軸目盛りの部分を追加します。
m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), ncol=6, byrow=T) # colnames(m) は不要 par(mar=c(10,5,5,5)) # グラフ外側の余白:底辺,左側,上側,右側の順 barplot(t(m), beside=T, # 並列棒グラフ col=c("red","green","blue"), # 棒の色。指定数が少ないときは繰り返す xlab = "series", ylab = "y", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 cex.names=1.5, # X軸目盛り(c1, c2 など) yaxt="n", # Y軸目盛りは、axis で指定するので非表示にする main="barplot24", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(h=seq(0, 6, 1), # Yの補助線(Xの補助線は不要でしょう) lty="dotted", # 点線 col="black") # 色 axis(side=1, # X軸の目盛り at=c(4, 11), # 目盛り位置(棒の中心になるよう適宜調整) labels=c("series1","series2"), # 目盛りの名称 cex.axis=1.5) # 目盛り文字拡大率 axis(side=2, # Y軸の目盛り(X軸の目盛りは barplot 内で設定) at=seq(0,5,1), # 目盛りの刻み cex.axis=1.5, # 文字拡大率 las=2) # 目盛りの文字を水平にする par(xpd=TRUE) # グラフの外側の表示を許す legend(par()$usr[1], # 凡例 左側 par()$usr[3]-1.5, # 下側から2だけ下 ncol=6, # 1行に表示する系列数 省略時は1 legend=c("c1","c2","c3","c4","c5","c6"), # 名称 pch=15, # 記号(棒・矩形の代用に■) col=c("red","green","blue"), # 記号の色(barplotのcolに合わせる) cex=1.5) # 凡例全体の拡大率 box() # グラフ枠(デフォルトでは上・右の線がない)
x <- c( 2, 4, 5, 3, 6, 4) # Xのデータ names(x) <- c("A","B","C","D","E","F") # Y軸の表示文字列 barplot(x, horiz=T, # 水平棒グラフ col=c("red","green","blue"), # 棒の色。指定数が少ないときは繰り返す xlab = "x", ylab = "item", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 cex.names=1.5, # Y軸目盛り(names(x))の文字拡大率 las=2, # 目盛りの字を水平に xaxt="n", # X軸目盛りは、axis で指定するので非表示にする main="horiz11", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(v=seq(0, 8, 0.5), # Xの補助線(Yの補助線は不要でしょう) lty="dotted", # 点線 col="black") # 色 axis(side=1, # X軸の目盛り at=seq(0,6,1), # 目盛りの刻み cex.axis=1.5) # 文字拡大率 box() # グラフ枠(デフォルトでは上・右の線がない)
x <- c( 2, 4, 5, 3, 6, 4) m <- matrix(0,6,1) # 積上げにするため縦方向のマトリクスにする m[ ,1] <- x # 百分比にするなら、m[ ,1] <- x/sum(x)*100 とする barplot(m, horiz=T, # 水平棒グラフ col=c("red","green","blue"), # 棒の色。指定数が少ないときは繰り返す xaxt="n", # X軸目盛りは、axis で指定するので非表示にする main="horiz12", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 axis(side=1, # X軸の目盛り at=seq(0,25,5), # 目盛りの刻み(百分比にするなら 0,100,10 とする cex.axis=1.5) # 文字拡大率 legend("bottom", # 凡例の表示位置 legend=c("c1","c2","c3","c4","c5","c6"), # 名称 ncol=6, # 1行に6項目 pch=15, # 記号(棒・矩形の代用に■) col=c("red","green","blue"), # 記号の色(barplotのcolに合わせる) cex=1.5) # 凡例全体の拡大率
棒の幅を狭くする手段 グラフの外の空白を上下に多くとりグラフの縦を小さくする par(mar=c(25,2,5,2)) 凡例をグラフの外側に表示する グラフの外側の表示を許す par(xpd=TRUE) 凡例の位置を工夫する x=par()$usr[1] (凡例の左上端とグラフの端に合わせる 1 左、2 右、3 上、4 下)
x <- c( 2, 4, 5, 3, 6, 4) m <- matrix(0,6,1) m[ ,1] <- x par(mar=c(25,2,5,2)) # グラフ外側の余白:底辺,左側,上側,右側の順 barplot(m, horiz=T, col=c("red","green","blue"), xaxt="n", main="horiz13", cex.main=3, col.main="red") axis(side=1, at=seq(0,25,5), cex.axis=1.5) par(xpd=TRUE) # グラフの外側の表示を許す legend(x=par()$usr[1], # 凡例の左上をグラフの左端に合わせる y=par()$usr[3]-0.51, # 下端から0.5下へ legend=c("c1","c2","c3","c4","c5","c6"), ncol=6, pch=15, col=c("red","green","blue"), cex=1.8)
m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), ncol=6, byrow=T) colnames(m) <- c("c1","c2","c3","c4","c5","c6") par(mar=c(10,5,5,2)) # グラフ外側の余白:底辺,左側,上側,右側の順 barplot(m, horiz=T, # 水平棒グラフ col=c("red","blue"), # 棒の色。指定数が少ないときは繰り返す xlab="x", ylab="item", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 # Y軸の目盛り(colnames) cex.names=1.5, # 文字拡大率 las=2, # 目盛りを水平に表示 xaxt="n", # X軸目盛りは、axis で指定するので非表示にする main="horiz21", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(v=seq(0,10,1), # 補助線 lty="dotted") axis(side=1, # X軸の目盛り at=seq(0,10,2), # 目盛りの刻み(百分比にするなら 0,100,10 とする cex.axis=1.5) # 文字拡大率 par(xpd=TRUE) # グラフの外側の表示を許す legend(x=par()$usr[1]+3, # 凡例の左上をグラフの左端から3右へ y=par()$usr[3]-2, # 下端から2下へ legend=c("sertes1","series2"), ncol=2, pch=15, col=c("red","blue"), cex=1.5) box() # グラフ全体の枠
m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), ncol=6, byrow=T) mt <- t(m) # 行と列を入れ替えた置換行列 colnames(mt) <- c("serias1","serias2") par(mar=c(15,5,5,2)) # グラフ外側の余白:底辺,左側,上側,右側の順 barplot(mt, horiz=T, col=c("red","green","blue"), # 棒の色 xlab="x", ylab="serias", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 # Y軸の目盛り(colnames) cex.names=1.5, # 文字拡大率 las=2, # 目盛りを水平に表示 xaxt="n", # X軸目盛りは、axis で指定するので非表示にする main="horiz22", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(v=seq(0,30,5), # 補助線 lty="dotted") axis(side=1, # X軸の目盛り at=seq(0,30,5), # 目盛りの刻み(百分比にするなら 0,100,10 とする cex.axis=1.5) # 文字拡大率 par(xpd=TRUE) # グラフの外側の表示を許す legend(x=par()$usr[1]+3, # 凡例の左上をグラフの左端から3右へ y=par()$usr[3]-1, # 下端から1下へ legend=c("c1","c2","c3","c4","c5","c6"), # 名称 ncol=6, # 1行に6項目 pch=15, # 記号(棒・矩形の代用に■) col=c("red","green,""blue"), # 記号の色(barplotのcolに合わせる) cex=1.5) # 凡例全体の拡大率 box() # グラフ全体の枠
基本形 # c1 c2 c3 c4 c5 c6 ← Y軸の目盛り m <- matrix(c(4, 2, 6, 4, 5, 4, # 4 2 6 4 5 4 ← 系列1 5, 6, 4, 5, 3, 5), # 5 6 4 5 3 5 ← 系列2 ncol=6, byrow=T) colnames(m) <- c("c1","c2","c3","c4","c5","c6") barplot(m, horiz=T, # 水平棒グラフ beside=T) # 並列
m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), ncol=6, byrow=T) colnames(m) <- c("c1","c2","c3","c4","c5","c6") barplot(m, horiz=T, beside=T, # 並列水平棒グラフ col=c("red","blue"), # 棒の色。指定数が少ないときは繰り返す xlab = "x", ylab = "item", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 col.lab="blue", # 色 # Y軸の目盛り(colnames) cex.names=1.5, # 文字拡大率 las=2, # 目盛りを水平に表示 xaxt="n", # X軸目盛りは、axis で指定するので非表示にする main="horiz23", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(v=seq(0, 6, 0.5), # Xの補助線(Xの補助線は不要でしょう) lty="dotted", # 点線 col="black") # 色 axis(side=1, # X軸の目盛り at=seq(0,6,1), # 目盛りの刻み cex.axis=1.5) # 文字拡大率 legend("bottomright", # 凡例の表示位置 legend=c("serias1","serias2"), # 名称 pch=15, # 記号(棒・矩形の代用に■) col=c("red","blue"), # 記号の色(barplotのcolに合わせる) cex=1.5) # 凡例全体の拡大率 box() # グラフ枠(デフォルトでは上・右の線がない)
基本形 horiz24 の m を行・列を転置すればよい # mt series1 series2 m <- matrix(c(4, 2, 6, 4, 5, 4, # 4 5 5, 6, 4, 5, 3, 5), # 2 6 ncol=6, byrow=T) # 6 4 mt <- t(m) # 転置行列 # 4 5 colnames(mt) <- c("series1","series2") # 5 3 # 4 5 barplot(mt, horiz=T, # 水平棒グラフ beside=T) # 並列グラフの上下順序が凡例の上下順序が逆になることに注意
m <- matrix(c(4, 2, 6, 4, 5, 4, 5, 6, 4, 5, 3, 5), ncol=6, byrow=T) mt <- t(m) # 転置行列 colnames(mt) <- c("series1","series2") par(mar=c(5, 5, 5, 8)) # グラフ外側の余白:底辺,左側,上側,右側の順 barplot(mt, horiz=T, beside=T, # 並列水平棒グラフ col=c("red","green","blue"), # 棒の色。指定数が少ないときは繰り返す xlab = "x", ylab = "series", # 軸ラベル cex.lab=2, # 文字拡大率 col.lab="blue", # 色 # Y軸の目盛り(colnames) cex.names=1.5, # 文字拡大率 xaxt="n", # X軸目盛りは、axis で指定するので非表示にする main="horiz24", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(v=seq(0, 6, 1), # 補助線 lty="dotted", # 点線 col="black") # 色 axis(side=1, # X軸の目盛り at=seq(0,5,1), # 目盛りの刻み cex.axis=1.5) # 文字拡大率 par(xpd=TRUE) # グラフの外側の表示を許す legend(par()$usr[2], par()$usr[4], # 凡例の表示位置 legend=c("c6","c5","c4","c3","c2","c1"), # グラフの上下順に合わせる pch=15, col=c("blue","green","red"), # 記号の色 cex=1.5) # 凡例全体の拡大率 box() # グラフ枠(デフォルトでは上・右の線がない)
x <- c(20, 15, 10, 5) pie(x, # 円グラフ # radius # 円の大きさ(省略時 0.8) clockwise=T, # T:時計回り、F(省略時):反時計回り # init.angle # 最初角度(省略時0。12時の方向) labels=c("A","B","C","D"), # ラベル名 cex=2, # 文字拡大率 # 領域 col=c("red","green","blue","gray"), # 各領域の塗りつぶしの色 # density # 斜線で塗りつぶしをするときの斜線数 # angle # 斜線角度 border="black", # 領域枠の色 main="pie11", # タイトル col.main="red", # 色 cex.main=3) # 文字拡大率
まず円グラフを描き、そのあとで小さな白い円を重ねて描きます。2つのグラフを重ねるので、par(new=TRUE)(詳細後述)が必要です。また、ドーナツの真ん中にテキストを入れてみます。
# 先のグラフ x <- c(20, 15, 10, 5) pie(x, clockwise=T, labels=c("A","B","C","D"), cex=2, col=c("red","green","blue","gray")) # 重ね描き par(new=TRUE) # 中央の白円 pie(1, # ダミー radius=0.4, # 半径 col="white", # 領域の色 border="white", # 枠線の色 labels="") # ラベル非表示 # テキストの挿入 text(0, 0, # 挿入位置 labels="pie12", cex=3, col="red")
複数のグラフを重ね描きする rot や barplot など、グラフを描く関数が実行されると以前のグラフが消える それを防ぐには、次の二つがある。
・add=T 前のグラフを消さずに次のグラフを描く plot(前のグラフ) plot(次のグラフ, add=T) ・par(new=T) 関数 前のグラフに重ね書きする plot(前のグラフ) par(new=T) plot(次のグラフ) 前後のグラフでX軸が共有される ・双方のグラフで、plot( … , xlim=c(xmax: xmax) ) を一致させる必要がある ・前のグラフでX軸を指定し、後のグラフでは非表示にする。 前グラフで設定(外付けしてもよい) X軸ラベルの指定 X軸見出しの指定 通常はnamesを用いて指定 後グラフ xlab="n" により非表示にする Y軸について、 ・双方で共通の場合 双方のグラフで、plot( … , ylim=c(ymax: ymax) ) も一致させる必要がある 前グラフでY軸で設定し、後グラフでは ylab="n" で非表示にする (後グラフは線や棒を描くだけにする) ・後グラフを右Y軸にするとき 右Y軸を mtext() 関数で設定する(後述) グラフの右側に余白が必要になることもある par(mar=…) を用いる(後述) mtext 関数 mtext("テキスト", # Y2軸ラベル side=4, # 1:下,2:左,3:上,4:右 line=0, # 図形領域から何行離すかを指定 at=NA. # 文字列を書き込む座標 col, cex, las) par(mar=c(0,0,0,2)) 底辺,左側,上側,右側の順でグラフ外側の余白を指定(単位は標準の文字行高さ) par(oma=c(0,0,0,2)) 外側余白(outer margin)を行の高さ(mex)で指定
y1 <- c( 4, 6, 5, 8, 7, 7, 9) # 左側のY y2 <- c(10,20,20,40,30,40,30) # 右側のY x <- seq(15, 21, 1) # X軸 par(oma = c(0, 0, 0, 2)) # グラフでは右側の余白 # 最初のグラフ:左側 (x y1) plot(x, y1, type="l", col="red", lwd=2, # 線のタイプと色 xlim=c(15,21), # X軸の表示範囲 後のグラフと一致させる必要 xlab="year", ylab="y1", cex.lab=2, # Xと左Y軸ラベル axes=F, # 軸目盛りは共通指定としてここでは引かない main="2axis11", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(v=seq(15,21,1), lty="dotted") # 縦の補助線 axis(side=1, seq(15,21,1), cex.axis=1.5) # X軸の目盛り abline(h=seq(0,10,1), lty="dotted", col="red") # 左Y軸の補助線 axis(side=2, seq(0,10,1), cex.axis=1.5, # 目盛り col.axis="red", las=2) # グラフの重ね描き par(new=TRUE) # 次のplotを描画しても消さない # 次のグラフ:右側 (x y2) plot(x, y2, type="l", col= "blue", lwd=2, xlim=c(15,21), # X軸の表示範囲。前のグラフと一致する必要あり xlab="", ylab="", # 重ね打ちにならないように空白にする, axes=F) mtext("y2",side=4, line=3, cex=2) # 右Y軸ラベルの設定 abline(h=seq(0,50,10), lty="dotted", col="blue") # 右Y軸の補助線 axis(side=4, seq(0,50,10), cex.axis=1.5, # 右Y軸の目盛り col.axis="blue", las=2) # 凡例 legend("bottomright", legend = c("y1", "y2"), col = c("red", "blue"), lwd = 2, cex=1.7) box()
塗りつぶしを避けるために棒グラフを前グラフにします。
# 入力データ y1 <- c( 4, 6, 5, 8, 7, 7, 9) # 棒グラフ y2 <- c(10,20,20,40,30,40,30) # 折線グラフ x <- c("A","B","C","D","E","F","G") # X軸 # グラフ外側の余白 par(mar=c(4, 5, 4, 5)) # 棒グラフを表示 names(y1) <- x barplot(y1, col="blue", xlab = "item", ylab = "y1-bar", # 軸ラベル cex.lab=2, # 文字拡大率 cex.names=1.5, # X軸目盛り(names(y))の文字拡大率 yaxt="n", # Y軸目盛りは、axis で指定するので非表示にする main="2axis12", # タイトル(グラフの上に表示される) cex.main=3, # 文字拡大率 col.main="red") # 色 abline(h=seq(0, 9, 1), # 左Yの補助線 lty="dotted", # 点線 col="blue") # 色 axis(side=2, # 左Y軸の目盛り at=seq(0,9,1), # 目盛りの刻み cex.axis=1.5, # 文字拡大率 col.axis="blue", las=2) # 目盛りの文字を水平にする # グラフの上書き par(new=T) # 折線グラフ plot(y2, type="b", pch=16, cex=3, col="red", lty=1, lwd=3, xlab="", ylab="", axes=F) # 軸関係はすべて非表示 # 右Y軸 mtext("y2-line", # 右Y軸の軸ラベル side=4, # 右Y軸 line=3, # 3行分だけ右にずらす col="red", cex=2) abline(h=seq(10,49, 5), # 右Yの補助線(Xの補助線は不要でしょう) lty="dotted", col="red") axis(side=4, # 右Y軸の目盛り at=seq(10,40,5), cex.axis=1.5, col.axis="red", las=2) # グラフを囲む box()
塗りつぶしを避けるために棒グラフを前グラフにします。
# ========== 入力データ 入力項目 <- c("A","B","C","D","E","ta") 入力頻度 <- c(40, 20, 50, 10, 30, 20) その他の項目名 <- "ta" # ===== 入力データの確認 項目 <- 入力項目 # "A" "B" "C" "D" "E" "ta" 頻度 <- 入力頻度 # 40 20 50 10 30 20 他の順位 <- which(項目==その他の項目名) # 6 他の項目 <- 項目[他の順位] # "ta" # ========== 項目のソート # ===== 項目が「ta:その他」の項を取り出しベクトルから削除する 項目 <- 項目[-他の順位] # "A" "B" "C" "D" "E" 他の頻度 <- 頻度[他の順位] # 20 頻度 <- 頻度[-他の順位] # 40 20 50 10 30 # ===== 頻度の大きい順に頻度と項目をソートする 順序 <- order(-頻度) # 3 1 5 2 4 項目 <- 項目[順序] # "C" "A" "E" "B" "D" 頻度 <- 頻度[順序] # 50 40 30 20 10 # ===== 末尾に "ta" を追加 項目 <- append(項目, 他の項目) # "C" "A" "E" "B" "D" "ta" 頻度 <- append(頻度, 他の頻度) # 50 40 30 20 10 20 ソート完了 # ========== ヒストグラム作図 合計 <- sum(頻度) # 170 頻度 <- 頻度/合計*100 # 百分率 29,4 23.5 17.6 11.8 5.9 11.8 names(頻度) <- 項目 # "C" "A" "E" "B" "D" "ta" barplot(頻度, ylim=c(0,100), col="gray", xlab="", ylab="", space=0, main="ABC", cex.main=3, col.main="red") # ========== 累積線の作成 par(new=T) 累積 <- cumsum(頻度) # 29.4 52.9 70.6 82.4 88.2 100. plot(累積, type="l", lwd=2, xlab="", ylab="", axes=F) # ========== デザイン abline(h=seq(0, 100, 10), lty="dotted") # 補助線 box() # グラフの枠
ここでは、次のタイプについて、単純な例を示すだけにします。 陽関数 y=f(x), 媒介関数 x=f(t),y=g(t), 特殊関数 outer(). contour(), persp() などが必要なもの 陰関数 f(x,y)=0, 3次元グラフ z=F(x,y)
一般形 curve(f(x), xmin, xmax) 刻み幅は自動的に設定されます 基本形 curve(x^2, -2, 2) # y = x^2 のグラフを -2 < x < 2 の範囲で描きます。 または fx <- function(x){ return(x^2) } # f(x) の記述を外出しするのに便利です。 curve(fx, -2, 2)
curve(x*(x-1)*(x+1), xlim=c(-2,2)
グラフ全体 A:グラフの色。太さ B:縦軸範囲の調整 C:目盛り間を同じ縦横比に 残念ながら簡単な方法はない D:原点にX・Y軸を作成 E:X目盛りをグラフ下ではなくX軸の下に。間隔指定。フォント指定。 F:Y目盛りをグラフ下ではなくY軸の左に。間隔指定。フォント指定。水平に表示 G:垂直方向の補助線の作成 H:水平方向の補助線の作成 I:X軸ラベルの体裁 J:Y軸ラベルの体裁 K:タイトルの追加 L:凡例の追加
curve(x*(x-1)*(x+1), col="red", lwd=4, # A グラフの色と太さ xlim=c(-2,2), ylim=c(-2,4), # B 縦軸範囲の調整 main="math12", # K タイトルの追加 cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # I X軸ラベルの文字列 ylab="y-axis", # J Y軸ラベルの文字列 cex.lab=2, # 文字拡大率 col.lab="blue", # 色 xaxt="n" ,yaxt="n") # E・F グラフの下、左の目盛りを非表示 abline(v=seq(-2, 2, 0.5), lty="dotted") # G 垂直方向の補助線 abline(h=seq(-2, 4, 0.5), lty="dotted") # H 水平方向の補助線 axis(side=1, # X軸(水平方向) pos=0, # D y=0 の位置 lwd=2, # D X軸の太さ col="blue", # 色 at=seq(-2, 2, 1), # E X目盛り間隔指定 cex.axis=1.5, # 文字拡大率 col.axis="blue") # 色 axis(side=2, # Y軸(垂直方向) pos=0, # D x=0 の位置 lwd=2, # D Y軸の太さ col="blue", # 色 at=seq(-2, 4, 1), # E Y目盛り間隔指定 cex.axis=1.5, # 文字拡大率 col.axis="blue", # 色 las=2) # 水平に表示 legend("bottomright", # L 凡例表示位置 legend="y=x*(x-1)*(x+1)", # 文字列 lty=1, lwd=2, col=c("red"), # 記号(直線) cex=1.3) # 凡例拡大率
math12 に y2=x*x のグラフを重ねます。 前のグラフに重ねるので、次のグラフ作成の前に par(new=T) を記述します。 グラフの大きさを同一にするために、次のグラフの xlim と ylim は前のグラフと同一にします。 各種体裁は前のグラフが記述しているので、次のグラフでは重複しないようにします。
curve(x*(x-1)*(x+1), col="red", lwd=4, # A グラフの色と太さ xlim=c(-2,2), ylim=c(-2,4), # B 縦軸範囲の調整 main="math13", # K タイトルの追加 cex.main=3, # 文字拡大率 col.main="red", # 色 xlab="x-axis", # I X軸ラベルの文字列 ylab="y-axis", # J Y軸ラベルの文字列 cex.lab=2, # 文字拡大率 col.lab="blue", # 色 xaxt="n" ,yaxt="n") # E・F グラフの下、左の目盛りを非表示 abline(v=seq(-2, 2, 0.5), lty="dotted") # G 垂直方向の補助線 abline(h=seq(-2, 4, 0.5), lty="dotted") # H 水平方向の補助線 axis(side=1, # X軸(水平方向) pos=0, # D y=0 の位置 lwd=2, # D X軸の太さ col="blue", # 色 at=seq(-2, 2, 1), # E X目盛り間隔指定 cex.axis=1.5, # 文字拡大率 col.axis="blue") # 色 axis(side=2, # Y軸(垂直方向) pos=0, # D x=0 の位置 lwd=2, # D Y軸の太さ col="blue", # 色 at=seq(-2, 4, 1), # E Y目盛り間隔指定 cex.axis=1.5, # 文字拡大率 col.axis="blue", # 色 las=2) # 水平に表示 # ここまで同じ。以下を追加 par(new=T) # グラフの重ね合わせ # 後のグラフ curve(x*x, col="blue", lwd=4, xlim=c(-2,2), ylim=c(-2,4), # 前のグラフと一致 xaxt="n" ,yaxt="n") # 前のグラフと重複しないように非表示 legend("bottomright", legend=c("y1=x*(x-1)*(x+1)", "y2=x*x"), lty=1, lwd=2, col=c("red","blue"), cex=1.2)
折線グラフだとして、plot(x(t), y(t), …) を用います。 tmin, tmax, dt が必要です。
t <- seq(0, 2*pi, 0.01*pi) # 0~2πを 0.01π刻み x <- sin(4*t)*sin(t) y <- sin(4*t)*cos(t) plot(x, y, type="l", col="red", lwd=2, asp=1, # X・Yの縦横比を同じにする main="math21", # タイトルの追加 cex.main=3, col.main="red", xlab="", ylab="", # 軸ラベルを非表示 xaxt="n" ,yaxt="n") # グラフの下、左の目盛りを非表示 axis(side=1, pos=0, at=seq(-1,1,1)) # 単純なX軸とX目盛り axis(side=2, pos=0, at=seq(-1,1,1), las=2) # 単純なY軸とY目盛り
t <- seq(0, 2*pi, 0.01*pi) # 0~2πを 0.01π刻み r <- 0.5*sin(5*t)+0.3*cos(10*t) + 1 plot(x=r*sin(t), y=r*cos(t), type="l", col="red", lwd=2, asp=1, main="math22", cex.main=3, col.main="red", xlab="", ylab="", xaxt="n" ,yaxt="n") axis(side=1, pos=0, at=seq(-2,2,1)) # 単純なX軸とX目盛り axis(side=2, pos=0, at=seq(-2,2,1), las=2) # 単純なY軸とY目盛り
f(x,y) = x^2+y^2+1)^2-4*x^2-1 = 0 のグラフ outer(x, y, fxy) x と y の外積(すべての点)でのfxyの計算値 巨大な行列になる contour(x, y, z, levels=0, asp=1) z=levers となる座標(x,y)を表示する levels=0 なら f(x,y)=0 の解となる
x <- seq(-2, 2, 0.05) # from -2 to 2 step 0.05 y <- seq(-1, 1, 0.05) fxy <- function(x,y) (x^2+y^2+1)^2-4*x^2-1 # f(x,y) の定義 z <- outer(x, y, fxy) # outer 外積関数。 (x,y) の各点で fxy を計算したときの行列になる contour(x, y, z, levels=0, # z=0 のとき、グラフに点を表示 col="red") # cex指定は無視 # contour には main や xlab, xaxt などを与えられないので省略形のままにする abline(h=0) abline(v=0) # X・Y軸 title("math31", col.main="red", cex.main=3)
math31 では、f(x,y)=0 のグラフでしたが、f(x,y)=-0,2, -0.1, 0, 0.1, 0.2 の等高線グラフにしました。
x <- seq(-2, 2, 0.1) y <- seq(-1, 1, 0.1) fxy <- function(x,y) (x^2+y^2+1)^2-4*x^2-1 # f(x,y) = zlist となる5本のグラフになります zlist <- seq(-0.2, 0.2, 0.1) zcol <- c("#00ff00","#ffff00","#ff0000","#ff00ff","#0000ff") z <- outer(x, y, fxy) contour(x, y, z, levels=zlist, col=zcol) abline(h=0) abline(v=0) title("math32", col.main="red", cex.main=3)
z = f(x,y) = exp(-(x^2+y^2-x*y)) のグラフを描きます。
outer(x, y, fxy) で配列を計算するのは math32 と同じですが、3次元グラフにするには contour ではなく、persp を用います。
persp x-y平面、高さz の3次元グラフで、曲面の各軸方向断面を折れ線で近似したワイヤフレームを描画します。
persp(x,y,z, options) options: theta:水平(横)方向の回転(方位角 azimuth) phi:縦方向の回転(余緯度 colatitude) expand:縦横比 ticktype="detailed":軸目盛りの表示
x <- seq(-2, 2, 0.1) y <- seq(-2, 2, 0.1) fxy <- function(x,y) exp(-(x^2+y^2-x*y)) z = outer(x, y, fxy) persp(x, y, z, theta=120, phi=20, expand=1, ticktype="detailed") title("math41", col.main="red", cex.main=3)