1. ホーム
  2. r

[解決済み] Rで3Dデータをプロットする

2022-03-05 01:42:33

質問

3Dデータセットがあります。

data = data.frame(
    x = rep( c(0.1, 0.2, 0.3, 0.4, 0.5), each=5),
    y = rep( c(1, 2, 3, 4, 5), 5)
)

data$z = runif(
    25,
    min = (data$x*data$y - 0.1 * (data$x*data$y)),
    max = (data$x*data$y + 0.1 * (data$x*data$y))
)

data
str(data)

そして、それをプロットしたいのですが、Rの組み込み関数では、いつもエラーが出ます。

x' と 'y' の値が増加することが予想されます。

# ### 3D Plots ######################################################
# built-in function always give the error
#    "increasing 'x' and 'y' values expected"
demo(image)
image(x = data$x, y = data$y, z = data$z)

demo(persp)
persp(data$x,data$y,data$z)

contour(data$x,data$y,data$z)

インターネットで検索したところ、このメッセージはXとYの値の組み合わせが一意でない場合に発生することがわかりました。しかし、ここでは一意である。

他のライブラリも試してみましたが、そこでは問題なく動作しています。しかし、私はプロットのデフォルトのスタイルが好きではありません(ビルトイン関数は私の期待に応えるべきです)。

# ### 3D Scatterplot ######################################################
# Nice plots without surface maps?
install.packages("scatterplot3d", dependencies = TRUE)
library(scatterplot3d)
scatterplot3d(x = data$x, y = data$y, z = data$z)

# ### 3D Scatterplot ######################################################
# Only to play around?
install.packages("rgl", dependencies = TRUE)
library(rgl)
plot3d(x = data$x, y = data$y, z = data$z)
lines3d(x = data$x, y = data$y, z = data$z)
surface3d(x = data$x, y = data$y, z = data$z)

なぜ私のデータセットは組み込み関数に受け入れられないのですか?

解決方法を教えてください。

グリッド間隔とシーケンスが増加または一意であることが保証できない "real"データを扱っている場合(うまくいけば (x,y,z) の組み合わせは、たとえこれらのトリプルが重複していたとしても、少なくとも一意であることをお勧めします。 akima パッケージは、不規則なグリッドから規則的なグリッドに補間するために使用されます。

の定義を使って data :

library(akima)
im <- with(data,interp(x,y,z))
with(im,image(x,y,z))

<イグ

また、これは image が、似たような関数もあります。

によってデータがマッピングされるデフォルトのグリッドに注意してください。 akima::interp の範囲にまたがる40個の等間隔で定義される。 xy の値を指定します。

> formals(akima::interp)[c("xo","yo")]
$xo
seq(min(x), max(x), length = 40)

$yo
seq(min(y), max(y), length = 40)

しかし、もちろん、これは引数を渡すことで上書きすることができます。 xoyo から akima::interp .