インタラクティブな等高線も!Rにおけるプロット作成の選択肢

2025-05-27

Level (Contour) Plots(等高線プロット)とは

等高線プロットは、3次元のデータを2次元平面上に視覚化するためのグラフです。地理情報システム(GIS)で使われる地形図の等高線と同じように、高さや値が同じ点を結んだ線(等高線)を描くことで、データの起伏や分布のパターンを表現します。

具体的には、X軸とY軸に2つの変数をとり、その2つの変数の組み合わせに対応する第3の変数(Z値)の値を等高線で示します。Z値は、例えば標高、温度、濃度、確率密度など、様々な量的データに適用できます。

Rでの等高線プロットの作成方法

Rには、等高線プロットを作成するためのいくつかの方法があります。

ベースRグラフィックスの contour() 関数

最も基本的な方法として、Rに標準で備わっているcontour()関数を使用します。

使用例

# データの準備
# xとyのグリッドを定義
x <- seq(-2, 2, length.out = 50)
y <- seq(-2, 2, length.out = 50)

# Z値を計算する関数(例: 2変量正規分布の密度)
z <- outer(x, y, function(x, y) {
  dnorm(x, mean = 0, sd = 1) * dnorm(y, mean = 0, sd = 1)
})

# 等高線プロットの描画
contour(x, y, z,
        main = "基本的な等高線プロット", # タイトル
        xlab = "X軸",                    # X軸ラベル
        ylab = "Y軸",                    # Y軸ラベル
        nlevels = 10)                    # 等高線の数

contour()関数の主な引数

  • col, lwd, lty: 等高線の色、線の太さ、線種を指定します。
  • add = TRUE: 既存のプロットに等高線を追加する場合に使用します。
  • levels: 描画したいZ値の特定の値をベクトルで指定することもできます。
  • nlevels: 描画する等高線の数を指定します。デフォルトは10です。
  • main, xlab, ylab: タイトルと軸ラベル。
  • z: xyの各組み合わせに対応するZ値の行列。outer()関数を使うと、2つのベクトルから簡単にZ値の行列を作成できます。
  • x, y: グリッド点の座標を表すベクトル。

filled.contour() 関数(塗りつぶし等高線プロット)

filled.contour()関数は、等高線の間を色で塗りつぶすことで、Z値の連続的な変化をより視覚的に分かりやすく表現します。ヒートマップに等高線が重ねられたようなイメージです。

使用例

# データの準備(上記と同じ)
x <- seq(-2, 2, length.out = 50)
y <- seq(-2, 2, length.out = 50)
z <- outer(x, y, function(x, y) {
  dnorm(x, mean = 0, sd = 1) * dnorm(y, mean = 0, sd = 1)
})

# 塗りつぶし等高線プロットの描画
filled.contour(x, y, z,
               main = "塗りつぶし等高線プロット",
               xlab = "X軸",
               ylab = "Y軸",
               color.palette = terrain.colors # 色のパレットを指定
               )

filled.contour()は、凡例が自動的に表示される点も特徴です。

ggplot2 パッケージ

Rの強力なグラフ作成パッケージであるggplot2を使用すると、より柔軟で美しい等高線プロットを作成できます。geom_contour()関数やgeom_contour_filled()関数を使います。

使用例

# ggplot2パッケージの読み込み
library(ggplot2)
library(dplyr) # データフレーム操作のために使用

# データの準備
# ggplot2はデータフレーム形式のデータを好みます
data_df <- expand.grid(x = seq(-2, 2, length.out = 50),
                       y = seq(-2, 2, length.out = 50)) %>%
  mutate(z = dnorm(x, mean = 0, sd = 1) * dnorm(y, mean = 0, sd = 1))

# 基本的な等高線プロット
ggplot(data_df, aes(x = x, y = y, z = z)) +
  geom_contour(color = "blue") + # 等高線を青色で表示
  labs(title = "ggplot2による等高線プロット", x = "X軸", y = "Y軸") +
  theme_minimal() # シンプルなテーマを適用

# 塗りつぶし等高線プロット
ggplot(data_df, aes(x = x, y = y, z = z)) +
  geom_contour_filled(aes(fill = after_stat(level))) + # レベルごとに色を塗り分け
  labs(title = "ggplot2による塗りつぶし等高線プロット", x = "X軸", y = "Y軸", fill = "Z値") +
  theme_minimal()

ggplot2では、aes()関数で美的属性(X、Y、Z、色など)をマッピングし、geom_contour()geom_contour_filled()で等高線を描画します。after_stat(level)は、等高線のレベル(Z値)に応じて色を塗り分けるためのものです。

  • 科学シミュレーションの結果表示
    物理現象の空間的な変化を表現。
  • 最適化問題の可視化
    目的関数の等高線を描き、最適解の探索を支援。
  • 統計的な分布の表現
    2変量正規分布などの確率密度関数を視覚化。
  • 気象データの分析
    気温や気圧の分布をマッピング。
  • 地形データの可視化
    標高データから地形図を作成。


データ形式に関するエラー

等高線プロットでは、X、Y座標とそれに対応するZ値のデータが特定の形式である必要があります。

エラーの例

  • x and y must be sorted and unique
    X軸とY軸のデータが昇順にソートされていなかったり、重複する値が含まれている場合に発生することがあります。特にfilled.contour()で問題になることがあります。
  • z must be a matrix
    contour()filled.contour() 関数で最もよくあるエラーです。z引数に渡されるデータが数値の行列(matrix)ではない場合に発生します。

トラブルシューティング

  • X, Yをソートする
    もしXやYのデータがソートされていない場合、sort() 関数で昇順にソートします。
  • X, Yのデータがグリッド形式になっているか確認する
    contour()filled.contour() は、XとYのデータが等間隔のグリッドを形成していることを前提としています。もしランダムな散布データから等高線を描きたい場合は、後述する補間(interpolation)が必要です。
  • zが行列であることを確認する
    • outer() 関数を使ってXとYの組み合わせからZ値を計算している場合、結果は自動的に行列になります。
    • もしデータフレームなどからZ値を取り出す場合、as.matrix() を使って行列に変換してください。
    • 例:z_matrix <- as.matrix(my_dataframe[, 3])

データ範囲に関するエラー

  • 外れ値によるプロットの歪み
    データに極端な外れ値が含まれていると、等高線が集中しすぎたり、プロット全体が歪んで見えたりすることがあります。
  • 等高線が表示されない
    コードはエラーなく実行されるが、プロットウィンドウに何も等高線が表示されない。これは、Z値の範囲とnlevelslevelsの指定が適切でない場合に起こりえます。
  • 外れ値の処理
    データの探索的分析(EDA)を行い、外れ値がある場合は、それらをクリーンアップするか、プロットの範囲を調整することを検討します。zlim引数でZ軸の表示範囲を制限することもできます。
  • nlevelsまたはlevelsを適切に設定する
    • nlevels(等高線の数)が少なすぎると、変化が少ないように見えることがあります。逆に多すぎると線が密集しすぎます。
    • levels引数を使って、表示したいZ値の具体的な範囲や値を指定すると、よりコントロールできます。例:levels = seq(min(z), max(z), length.out = 10)
  • Z値の範囲を確認する
    range(z) を実行してZ値の最小値と最大値を確認します。

グリッドデータではない場合(散布データ)

問題

多くの等高線プロット関数は、XとYが規則的なグリッドを形成し、それぞれの交点にZ値があることを前提としています。しかし、実データはランダムなX, Y, Zの散布データであることがよくあります。この場合、そのままでは等高線プロットを作成できません。

  • 補間(Interpolation)を行う
    散布データからグリッドデータを生成するために、補間を行う必要があります。
    • akima パッケージ
      interp() 関数は、散布データからグリッドデータを生成するのに非常に便利です。
      # install.packages("akima")
      library(akima)
      
      # ランダムな散布データ
      set.seed(123)
      x_scatter <- runif(100, 0, 10)
      y_scatter <- runif(100, 0, 10)
      z_scatter <- sin(x_scatter) + cos(y_scatter) + rnorm(100, 0, 0.5)
      
      # 補間
      interp_data <- interp(x = x_scatter, y = y_scatter, z = z_scatter,
                            xo = seq(0, 10, length.out = 50),
                            yo = seq(0, 10, length.out = 50))
      
      # 補間されたデータでプロット
      contour(interp_data$x, interp_data$y, interp_data$z)
      
    • splines パッケージの interp2xyz(fieldsパッケージに含まれる)
    • fields パッケージ
      Tps() 関数などで、より高度な補間が可能です。
    • ggplot2 の geom_contour()
      ggplot2は内部的に補間を行うため、データフレーム形式の散布データをそのまま渡しても等高線を描画できる場合があります(ただし、データが疎だと補間結果が不正確になることもあります)。

プロットの見た目とカスタマイズ

  • 凡例がない(contour()の場合)
    contour()は自動的に凡例を表示しません。
  • ラベルが重なる、見にくい
    等高線に付くラベルが読みにくい場合があります。
  • 等高線の色が単調すぎる、見分けにくい
    デフォルトの色では、変化のパターンが分かりにくいことがあります。
  • 凡例の追加(contour()の場合)
    • contour() 関数自体には凡例を追加する引数はありません。legend() 関数を別途使用して手動で凡例を追加するか、filled.contour()ggplot2 の使用を検討してください。
  • 等高線ラベルの調整
    • contour()labcex 引数でラベルのフォントサイズを調整できます。
    • labcol でラベルの色を変更できます。
    • drawlabels = FALSE でラベルを非表示にすることもできます。
  • 色のパレットを調整する
    • filled.contour()ではcolor.palette引数で色の関数を指定します。例えば、heat.colors, terrain.colors, topo.colors, cm.colorsなどがあります。
    • RColorBrewer パッケージを使用すると、より多くの美しいカラーパレットが利用できます。
      # install.packages("RColorBrewer")
      library(RColorBrewer)
      filled.contour(x, y, z, color.palette = brewer.pal.ready("YlOrRd"))
      
    • ggplot2では、scale_fill_continuous()scale_fill_gradientn() などで色の調整が可能です。
  • データフレーム形式の不備
    ggplot2はデータフレーム形式のデータを期待します。X, Y, Zが別々のベクトルになっているとエラーになります。
  • geom_contour requires the following missing aesthetics: z
    aes() マッピングでz引数を指定し忘れている。
  • geom_contour_filled の fill = after_stat(level) を確認する
    塗りつぶしを行う場合は、fillafter_stat(level)を指定して、等高線のレベル(Z値)に応じて色が変わるようにします。
  • データをデータフレームに変換する
    # 既存のX, Y, Zベクトルからデータフレームを作成
    my_data <- data.frame(X = x_vec, Y = y_vec, Z = z_matrix_flattened)
    # または expand.grid を使用してグリッドデータを生成
    my_data <- expand.grid(x = x_vals, y = y_vals) %>%
      mutate(z = calculate_z_for_each_xy(x, y))
    
  • aes(x = X変数名, y = Y変数名, z = Z変数名) を確認する
    忘れずにzをマッピングしてください。


例1: ベースRのcontour()関数による基本的な等高線プロット

contour()関数は、Rに標準で備わっている最も基本的な等高線プロットの関数です。

# --------------------------------------------------
# 例1: ベースRのcontour()関数による基本的な等高線プロット
# --------------------------------------------------

# データの準備
# X軸とY軸の範囲を定義
x <- seq(-3, 3, length.out = 50) # -3から3までを50分割
y <- seq(-3, 3, length.out = 50) # -3から3までを50分割

# Z値を計算
# outer()関数を使って、XとYの全ての組み合わせに対するZ値を計算します。
# ここでは、2変量正規分布の確率密度関数をZ値として使用します。
# Z[i, j] は x[i] と y[j] の組み合わせに対応するZ値です。
z <- outer(x, y, function(x_val, y_val) {
  dnorm(x_val, mean = 0, sd = 1) * dnorm(y_val, mean = 0, sd = 1)
})

# 等高線プロットの描画
contour(x = x, y = y, z = z,
        main = "基本的な等高線プロット (Base R)", # グラフのタイトル
        xlab = "X軸",                             # X軸のラベル
        ylab = "Y軸",                             # Y軸のラベル
        nlevels = 10,                             # 表示する等高線の数
        col = "blue",                             # 等高線の色
        lwd = 1.5,                                # 等高線の太さ
        labcex = 0.8)                             # 等高線ラベルの文字サイズ

# 等高線プロットに点を追加する例 (オプション)
# 複数のプロットを重ねる際は、まず最初のプロットを描き、
# その後 add = TRUE を指定して追加していきます。
points(0, 0, col = "red", pch = 19, cex = 2) # 中心に赤い点を追加
text(0.5, 0.5, "中心", col = "red")         # テキストを追加

解説

  • col, lwd, labcex: 等高線の色、線の太さ、ラベルの文字サイズをそれぞれ指定します。
  • nlevels: 等高線の本数を指定します。値が大きいほど細かく描画されます。
  • outer(x, y, FUN): xyのすべての組み合わせに対してFUNを適用し、結果を行列で返します。等高線プロットのz引数に必要な形式です。

例2: ベースRのfilled.contour()関数による塗りつぶし等高線プロット

filled.contour()関数は、等高線の間を色で塗りつぶすことで、Z値の連続的な変化を視覚的に表現します。自動的にカラーバー(凡例)も表示されます。

# --------------------------------------------------
# 例2: ベースRのfilled.contour()関数による塗りつぶし等高線プロット
# --------------------------------------------------

# データの準備 (例1と同じZ値を使用)
x <- seq(-3, 3, length.out = 50)
y <- seq(-3, 3, length.out = 50)
z <- outer(x, y, function(x_val, y_val) {
  dnorm(x_val, mean = 0, sd = 1) * dnorm(y_val, mean = 0, sd = 1)
})

# 塗りつぶし等高線プロットの描画
filled.contour(x = x, y = y, z = z,
               main = "塗りつぶし等高線プロット (Base R)",
               xlab = "X軸",
               ylab = "Y軸",
               color.palette = terrain.colors, # 使用するカラーパレット(地形図のような色)
               nlevels = 20)                    # 等高線の数(色のグラデーションの細かさ)

# 別のカラーパレットの例
# filled.contour(x, y, z, color.palette = heat.colors, main = "Heat Colors")
# filled.contour(x, y, z, color.palette = topo.colors, main = "Topo Colors")
# filled.contour(x, y, z, color.palette = cm.colors, main = "CM Colors")

# RColorBrewerパッケージの色を使用する例
# install.packages("RColorBrewer") # 必要であればインストール
library(RColorBrewer)
filled.contour(x = x, y = y, z = z,
               main = "塗りつぶし等高線プロット (RColorBrewer)",
               xlab = "X軸",
               ylab = "Y軸",
               color.palette = colorRampPalette(brewer.pal(9, "YlGnBu")), # 青緑系のグラデーション
               nlevels = 15)

解説

  • RColorBrewerパッケージは、さらに多くの美しいカラーパレットを提供します。colorRampPalette()と組み合わせて使用します。
  • color.palette: 色のグラデーションを定義する関数を指定します。R標準のterrain.colorsheat.colorstopo.colorsなどがあります。

例3: ggplot2パッケージによる等高線プロット

ggplot2は、より柔軟で高機能なグラフ作成が可能なパッケージです。データフレーム形式のデータを扱い、レイヤーを重ねるようにグラフを作成します。

# --------------------------------------------------
# 例3: ggplot2パッケージによる等高線プロット
# --------------------------------------------------

# ggplot2パッケージの読み込み
# install.packages("ggplot2") # 必要であればインストール
# install.packages("dplyr")   # データフレーム操作のために読み込み推奨
library(ggplot2)
library(dplyr)

# データの準備
# ggplot2はデータフレーム形式のデータを好みます。
# expand.grid()でXとYの組み合わせを生成し、mutate()でZ値を計算します。
data_df <- expand.grid(x = seq(-3, 3, length.out = 50),
                       y = seq(-3, 3, length.out = 50)) %>%
  mutate(z = dnorm(x, mean = 0, sd = 1) * dnorm(y, mean = 0, sd = 1))

# 3-1: 基本的な等高線プロット (geom_contour)
ggplot(data_df, aes(x = x, y = y, z = z)) + # データをマッピング
  geom_contour(color = "darkgreen", linewidth = 0.8) + # 等高線を緑色で描画
  labs(title = "ggplot2による等高線プロット", # タイトル
       x = "X軸",                            # X軸ラベル
       y = "Y軸") +                           # Y軸ラベル
  theme_minimal()                              # シンプルなテーマを適用

# 3-2: 塗りつぶし等高線プロット (geom_contour_filled)
ggplot(data_df, aes(x = x, y = y, z = z)) +
  geom_contour_filled(aes(fill = after_stat(level))) + # レベルごとに色を塗り分け、凡例を自動生成
  labs(title = "ggplot2による塗りつぶし等高線プロット",
       x = "X軸",
       y = "Y軸",
       fill = "Z値") + # 凡例のタイトル
  scale_fill_viridis_d(option = "plasma") + # viridisカラーパレットを使用 (d for discrete)
  theme_minimal()

# 3-3: 塗りつぶし等高線と通常の等高線を重ねる
ggplot(data_df, aes(x = x, y = y, z = z)) +
  geom_contour_filled(aes(fill = after_stat(level)), alpha = 0.7) + # 透明度を調整
  geom_contour(color = "black", linewidth = 0.5) +                 # 黒い等高線を重ねる
  labs(title = "塗りつぶしと重ねた等高線 (ggplot2)",
       x = "X軸",
       y = "Y軸",
       fill = "Z値") +
  scale_fill_gradientn(colors = rev(RColorBrewer::brewer.pal(9, "RdYlBu"))) + # 暖色から寒色のグラデーション
  theme_minimal() +
  # ggplot2で凡例の位置を調整
  theme(legend.position = "right")

解説

  • theme_minimal(): グラフの背景やグリッドラインをシンプルなものに設定します。
  • labs(): タイトルや軸ラベル、凡例のタイトルを設定します。
  • scale_fill_viridis_d()scale_fill_gradientn(): 塗りつぶしの色のグラデーションやパレットを調整します。viridisパッケージは視認性の高いカラーパレットを提供します。
  • geom_contour_filled(): 塗りつぶし等高線を描画します。aes(fill = after_stat(level))とすることで、等高線のZ値に基づいて塗りつぶしの色を自動的に割り当て、凡例を生成します。
  • geom_contour(): 等高線を描画します。colorで線の色、linewidthで線の太さを指定します。
  • aes(x = ..., y = ..., z = ...): どの変数をX、Y、Zにマッピングするかを指定します。

実際のデータは規則的なグリッド形式ではないことが多いです。その場合、補間(interpolation)によってグリッドデータを生成してから等高線を描画します。ここではakimaパッケージのinterp()関数を使用します。

# --------------------------------------------------
# 例4: 散布データからの等高線プロット(補間を使用)
# --------------------------------------------------

# akimaパッケージの読み込み
# install.packages("akima") # 必要であればインストール
library(akima)

# ランダムな散布データの生成
set.seed(42) # 再現性のためにシードを設定
n_points <- 100
x_scatter <- runif(n_points, 0, 10)
y_scatter <- runif(n_points, 0, 10)
# Z値はXとYの組み合わせに基づいて生成し、ノイズを加える
z_scatter <- sin(x_scatter / 2) + cos(y_scatter / 2) + rnorm(n_points, 0, 0.3)

# 散布点のプロット(補間前の状態を確認)
plot(x_scatter, y_scatter, col = "gray", pch = 1,
     main = "元の散布データと補間後の等高線",
     xlab = "X", ylab = "Y")

# データの補間
# interp()関数を使用して、散布データからグリッドデータを生成します。
# xo, yoで、補間するグリッドのX, Y座標を指定します。
interp_data <- interp(x = x_scatter, y = y_scatter, z = z_scatter,
                      xo = seq(0, 10, length.out = 50),
                      yo = seq(0, 10, length.out = 50))

# 補間されたデータで等高線プロットを描画
# add = TRUE を指定して、既存の散布図に等高線を重ねます。
contour(x = interp_data$x, y = interp_data$y, z = interp_data$z,
        add = TRUE,         # 既存のプロットに追加
        col = "red",        # 等高線の色
        lwd = 1.2,          # 等高線の太さ
        nlevels = 10)       # 等高線の数

# 塗りつぶし等高線プロット (補間後のデータ)
# 新しいプロットウィンドウで表示
dev.new() # 新しいプロットウィンドウを開く
filled.contour(x = interp_data$x, y = interp_data$y, z = interp_data$z,
               main = "補間された散布データからの塗りつぶし等高線",
               xlab = "X軸",
               ylab = "Y軸",
               color.palette = colorRampPalette(c("lightgreen", "yellow", "orange", "red")),
               nlevels = 20)
  • add = TRUE: 既存のプロットに重ねて等高線を描画したい場合に指定します。
  • interp(x, y, z, xo, yo): 散布データx, y, zから、新しいグリッドxo, yo上にZ値を補間します。結果はリスト形式で返され、interp_data$x, interp_data$y, interp_data$zに行列データが格納されます。


これまでベースRのcontour()filled.contour()、そしてggplot2パッケージについて解説しましたが、Rには他にも3次元データの可視化や、等高線プロットに準ずる表現を行うための強力なパッケージや関数が多数存在します。

plotly パッケージ (インタラクティブな3Dプロット)

plotlyは、Webベースのインタラクティブなグラフを作成できるパッケージです。等高線プロットだけでなく、3Dの曲面プロットも簡単に作成でき、グラフを回転させたり、ズームしたり、データポイントのツールチップを表示したりできます。

特徴:

  • 3Dサーフェスプロット
    等高線プロットの元となる3D曲面も同時に表示できる。
  • Webベース
    HTML形式で出力できるため、WebサイトやR Markdownドキュメントに組み込みやすい。
  • インタラクティブ性
    マウス操作で視点を変更したり、データを探索したりできる。

使用例:

# install.packages("plotly")
library(plotly)

# データの準備 (例1と同じ2変量正規分布のZ値)
x <- seq(-3, 3, length.out = 50)
y <- seq(-3, 3, length.out = 50)
z <- outer(x, y, function(x_val, y_val) {
  dnorm(x_val, mean = 0, sd = 1) * dnorm(y_val, mean = 0, sd = 1)
})

# 3Dサーフェスプロットと等高線プロットを同時に作成
# type = "surface" で3D曲面、contours で等高線を重ねる
p <- plot_ly(x = ~x, y = ~y, z = ~z, type = "surface") %>%
  layout(
    title = "Plotlyによるインタラクティブな3Dサーフェスと等高線",
    scene = list(
      xaxis = list(title = "X軸"),
      yaxis = list(title = "Y軸"),
      zaxis = list(title = "Z軸")
    ),
    # 等高線の設定
    contours = list(
      z = list(
        show = TRUE,         # Z軸の等高線を表示
        usecolormap = TRUE,  # カラースケールを使用
        highlight = TRUE,    # ハイライト表示
        project = list(z = TRUE) # Z軸に投影
      )
    )
  )

p

# 等高線プロット単体 (type = "contour")
p_contour_only <- plot_ly(x = ~x, y = ~y, z = ~z, type = "contour") %>%
  layout(title = "Plotlyによる等高線プロット",
         xaxis = list(title = "X軸"),
         yaxis = list(title = "Y軸"))

p_contour_only

rgl パッケージ (OpenGLベースの3Dプロット)

rglは、OpenGLを使用して高速かつインタラクティブな3Dグラフィックスを提供するパッケージです。plotlyと同様に、3Dの曲面プロットを作成し、視点を自由に操作できます。等高線自体を直接描画する機能は限定的ですが、3D曲面上に等高線を重ねて表示することは可能です。

  • アニメーション
    3Dオブジェクトのアニメーションも可能。
  • 高いカスタマイズ性
    光源、マテリアル、視点などを細かく設定できる。
  • 高速描画
    OpenGLを利用するため、大規模なデータでもスムーズに動作する。
# install.packages("rgl")
library(rgl)

# データの準備 (例1と同じZ値)
x <- seq(-3, 3, length.out = 50)
y <- seq(-3, 3, length.out = 50)
z <- outer(x, y, function(x_val, y_val) {
  dnorm(x_val, mean = 0, sd = 1) * dnorm(y_val, mean = 0, sd = 1)
})

# 3Dサーフェスプロット
# color = "lightblue" で曲面の色を設定
# alpha = 0.8 で透明度を設定
open3d() # 新しいrglウィンドウを開く
persp3d(x, y, z, col = "lightblue", alpha = 0.8,
        xlab = "X", ylab = "Y", zlab = "Z",
        main = "RGLによる3Dサーフェスプロット",
        axes = TRUE, box = TRUE)

# 3D曲面上に等高線を重ねる (z=一定の平面でスライス)
levels_to_plot <- c(0.01, 0.05, 0.1, 0.15)
for (level in levels_to_plot) {
  # 等高線は2Dですが、3D空間内の特定のZ値の平面として描画
  # rgl.contour() のような直接的な関数はないため、persp3d の機能で擬似的に表現
  # あるいは、mesh3dなどで線を描画
  # ここでは、z=一定の平面(高さ)に色の変化で等高線を示唆する方法を示します。
  # より厳密な等高線は、事前に計算した等高線データ(線の座標)をlines3dで描画する必要があります。
  
  # Z値に基づいて色を割り当てる例 (等高線ではないが、値の変化を示す)
  # rgl.surfaceはZ値によって色を割り当てるため、等高線的な表現も可能
}

# より明示的な等高線表現のためには、 contourLines関数とlines3dを組み合わせる
cl <- contourLines(x, y, z, levels = levels_to_plot)
for (i in seq_along(cl)) {
  lines3d(cl[[i]]$x, cl[[i]]$y, rep(cl[[i]]$level, length(cl[[i]]$x)),
          col = "black", lwd = 2) # Z値が一定の高さに線を描画
}

# 視点を操作するには、rglウィンドウをドラッグする
# writeWebGL(dir = "webGL", filename = "3dplot.html") # WebGL形式で出力

lattice パッケージ (levelplot() 関数)

latticeパッケージは、複数の変数の関係性を可視化するための柔軟なグラフィックスシステムを提供します。levelplot()関数は、filled.contour()に似た塗りつぶし等高線プロットを作成しますが、より多面的な(facetting)表示や条件付きプロットに優れています。

  • 詳細なカスタマイズ
    パネルの配置、軸のラベル、凡例などを細かく制御できる。
  • 一貫した構文
    latticeの他のプロット関数と統一されたインターフェース。
  • 多面的なプロット
    複数の条件やグループに分けてサブプロットを簡単に作成できる。
# install.packages("lattice")
library(lattice)

# データの準備 (データフレーム形式)
# expand.grid()とmutate()でZ値を計算
data_df <- expand.grid(x = seq(-3, 3, length.out = 50),
                       y = seq(-3, 3, length.out = 50))
data_df$z <- dnorm(data_df$x, mean = 0, sd = 1) * dnorm(data_df$y, mean = 0, sd = 1)

# levelplotによる塗りつぶし等高線プロット
levelplot(z ~ x * y, data = data_df,
          main = "Latticeパッケージによる等高線プロット",
          xlab = "X軸",
          ylab = "Y軸",
          col.regions = terrain.colors(100), # 色のグラデーション
          contour = TRUE,                    # 等高線も重ねて表示
          cuts = 15)                         # 色の分割数 (等高線の本数に影響)

# 条件付きプロットの例 (架空のグループ変数を作成)
data_df$group <- factor(ifelse(data_df$x < 0, "Group A", "Group B"))

levelplot(z ~ x * y | group, data = data_df, # groupで分割
          main = "Latticeによる条件付き等高線プロット",
          xlab = "X軸",
          ylab = "Y軸",
          col.regions = heat.colors(100),
          contour = TRUE,
          cuts = 15,
          layout = c(2, 1)) # 2列1行で配置

fieldsパッケージは、空間データのモデリングと可視化に特化しており、地球科学や環境科学の分野でよく使用されます。image.plot()関数は、filled.contour()に似ていますが、より高度なオプションを提供し、特に補間や空間回帰の結果の可視化に便利です。

  • 大規模データ対応
    大規模な空間データセットの処理にも対応。
  • 高機能なヒートマップ/等高線
    カラーバー、グリッド線、データポイントのオーバーレイなど、詳細なカスタマイズが可能。
  • 空間データの処理
    空間的な補間、平滑化、予測などの機能を持つ。
# install.packages("fields")
library(fields)

# データの準備 (例1と同じZ値)
x <- seq(-3, 3, length.out = 50)
y <- seq(-3, 3, length.out = 50)
z <- outer(x, y, function(x_val, y_val) {
  dnorm(x_val, mean = 0, sd = 1) * dnorm(y_val, mean = 0, sd = 1)
})

# image.plotによる塗りつぶしプロット (等高線も重ねる)
# image.plotは、通常ヒートマップとして使われますが、等高線を重ねることができます
image.plot(x, y, z,
           main = "Fieldsパッケージによるイメージと等高線",
           xlab = "X軸", ylab = "Y軸",
           col = colorRampPalette(c("skyblue", "white", "salmon"))(100)) # カスタムカラーパレット

# image.plotの描画後、通常のcontour()関数で等高線を重ねる
contour(x, y, z, add = TRUE, col = "black", lwd = 0.8)

これらの代替手法は、それぞれ異なる強みと用途を持っています。

  • 空間統計データの詳細な可視化が必要な場合
    fields などを検討すると良いでしょう。目的に応じて最適なツールを選択してください。
  • 多面的な表示や条件付きプロットが必要な場合
    lattice
  • インタラクティブなプロットが必要な場合
    plotlyrgl