#要約
RStudioで以下のような色付き等高線図の描き方を紹介します。
- 等高線は、数式で与えられているものとします。上の図の場合は、円の式($z=x^2+y^2$)で描画しています。
#環境
- OS: Windows10
- R: R x64 4.0.3
- RStudio: Version 1.3.1093
#説明
まずは、ソースコード(Rファイル)とその結果をお見せします。後ほど、説明をいたします。
##ソースコード
n <- 100
x <- seq(-1,1,length=n)
y <- seq(-1,1,length=n)
z <- matrix(0, n, n)
for(i in 1:n){
for(j in 1:n){
z[i,j] <- x[i]^2 + y[j]^2
}
}
filled.contour(x, y, z,
nlevels = 10,
col = cm.colors(10),
plot.axes={
axis(1)
axis(2)
contour(x,y,z,nlevels=10,add=T)},
key.axes=axis(4,seq(0,2,by=0.2)))
##説明
filled.contour()
は、行列データを元に等高線図(contour)を描く関数です。
こちらのWebサイトの例を引用すると、
data(volcano)
filled.contour(volcano, color = terrain.colors, asp = 1)
このとき、filled.contour()
に渡したvolcano
というデータは、Rにはじめから組み込まれているデータセットであり、87×61の行列です。
(以下に、volcano
のデータの一部を示します。)
今回は、与えられた数式を用いて等高線図を描きたいという状況ですが、filled.contour()
は行列データしか受け付けてくれません。そこで、
- 数式を元に行列データを作成し、
- その行列データを
filled.contour()
に渡す
というステップを踏むことになります。
さて、最初にお見せしたソースコードを追い始めます。
n <- 100
x <- seq(-1,1,length=n)
y <- seq(-1,1,length=n)
z <- matrix(0, n, n)
n <- 100
は、作成する行列の大きさを指定しています。この数字が小さいと、出力される等高線図が粗くなりますので、必要十分な大きさの整数を設定してください。
x <- seq(-1,1,length=n)
とy <- seq(-1,1,length=n)
で、横軸(x軸)と縦軸(y軸)のベクトルを作成します。ここではともに、-1
から1
までを範囲としています。
z <- matrix(0, n, n)
で、filled.contour()
に渡す行列を作成しはじめます。まず、0で埋め尽くされたn×n(ここでは100×100)の行列を作成します。
そして、以下の二重のfor
文で、z
に具体的な値を代入していきます。数式は$x^2 + y^2$であり、円のグラフです。
for(i in 1:n){
for(j in 1:n){
z[i,j] <- x[i]^2 + y[j]^2
}
}
ここまでで、等高線図を作成するデータができあがりました。
ここからは、実際に等高線図を描画するコードです。
filled.contour(x, y, z,
nlevels = 10,
col = cm.colors(10),
plot.axes={
axis(1)
axis(2)
contour(x,y,z,nlevels=10,add=T)},
key.axes=axis(4,seq(0,2,by=0.2)))
filled.contour()
の詳細は、公式ドキュメントをご確認ください。
最初に、先ほど作成したx
、y
、z
を渡します。
nlevels
とは、等高線の領域の個数です。今回の等高線図では、0.0
から2.0
までが0.2
刻みで等分割されています。この分割数がnlevels
です。
col
は色の指定です。今回は、nlevels = 10
としたので、10個のカラーコード(#FFFFFFのようなコード)を渡す必要があります1。ところで、Rにはいくつかのカラーコードのデータセットが初めから組み込まれています。今回は、cm.colors()
を用いて10個のカラーコードを取得しています。
plot.axes
で、横軸・縦軸を描画します。axis(1)
、axis(2)
は、既存の軸データ(x
およびy
)を用いて横軸・縦軸を描画することを指示しています。
ここではさらに、contour(x,y,z,nlevels=10,add=T)
を追加することで、等高線の描画もしています。これがないと、等高線のない、色で塗り分けられただけの等高線図が出力されます。
x,y,z,nlevels=10
は先述の説明のとおりです。add=T
はグラフの重畳を許可するという意味です。これがないと、色で塗り分けられた等高線図を削除した状態で、等高線だけが描画されることになります。
最後のkey.axes=axis(4,seq(0,2,by=0.2))
は、等高線図の右側にあるカラーバーの表示です。0
から2
の0.2
刻みで目盛りを書き込むことを指示しています。
#参考Webサイト
https://stackoverflow.com/questions/46160054/how-do-i-add-color-to-a-contourplot-in-lattice
#姉妹記事
Rで3次元の色付き等高線図を描く
-
nlevels
よりも多くカラーコードを渡すと、先頭からnlevels
分のカラーコードを用い、以降は無視されます。一方、nlevels
よりも少なくカラーコードを渡すと、足りない分を、再び先頭のカラーコードから使用し始めます。仮にnlevels = 10
で3つしかカラーコードを渡さなかった場合、例えば、1, 4, 7, 10は同じ色で塗りつぶされます。 ↩