3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rで色付き等高線図を描く

Last updated at Posted at 2020-12-25

#要約
RStudioで以下のような色付き等高線図の描き方を紹介します。
20201225-1.png

  • 等高線は、数式で与えられているものとします。上の図の場合は、円の式($z=x^2+y^2$)で描画しています。

#環境

  • OS: Windows10
  • R: R x64 4.0.3
  • RStudio: Version 1.3.1093

#説明
まずは、ソースコード(Rファイル)とその結果をお見せします。後ほど、説明をいたします。
##ソースコード

test1.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)))

##結果
20201225-1.png

##説明
filled.contour()は、行列データを元に等高線図(contour)を描く関数です。
こちらのWebサイトの例を引用すると、

example1.r
data(volcano)
filled.contour(volcano, color = terrain.colors, asp = 1)

というコードを実行すると、以下の等高線図が描画されます。
20201225-2.png

このとき、filled.contour()に渡したvolcanoというデータは、Rにはじめから組み込まれているデータセットであり、87×61の行列です。
(以下に、volcanoのデータの一部を示します。)
20201225-3.png

今回は、与えられた数式を用いて等高線図を描きたいという状況ですが、filled.contour()は行列データしか受け付けてくれません。そこで、

  • 数式を元に行列データを作成し、
  • その行列データをfilled.contour()に渡す

というステップを踏むことになります。

さて、最初にお見せしたソースコードを追い始めます。

test1-1.r
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$であり、円のグラフです。

test1-2.r
for(i in 1:n){
  for(j in 1:n){
    z[i,j] <- x[i]^2 + y[j]^2
  }
}

ここまでで、等高線図を作成するデータができあがりました。
ここからは、実際に等高線図を描画するコードです。

test1-3.r
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()の詳細は、公式ドキュメントをご確認ください。

最初に、先ほど作成したxyzを渡します。

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)を追加することで、等高線の描画もしています。これがないと、等高線のない、色で塗り分けられただけの等高線図が出力されます。
20201225-4.png
x,y,z,nlevels=10は先述の説明のとおりです。add=Tはグラフの重畳を許可するという意味です。これがないと、色で塗り分けられた等高線図を削除した状態で、等高線だけが描画されることになります。

最後のkey.axes=axis(4,seq(0,2,by=0.2))は、等高線図の右側にあるカラーバーの表示です。0から20.2刻みで目盛りを書き込むことを指示しています。

#参考Webサイト
https://stackoverflow.com/questions/46160054/how-do-i-add-color-to-a-contourplot-in-lattice

#姉妹記事
Rで3次元の色付き等高線図を描く

  1. nlevelsよりも多くカラーコードを渡すと、先頭からnlevels分のカラーコードを用い、以降は無視されます。一方、nlevelsよりも少なくカラーコードを渡すと、足りない分を、再び先頭のカラーコードから使用し始めます。仮にnlevels = 10で3つしかカラーコードを渡さなかった場合、例えば、1, 4, 7, 10は同じ色で塗りつぶされます。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?