2

関数を使用していくつかの問題が発生していscatter3dます。具体的には、軸の制限を関数に指示することは不可能のようです。これは、私が使用しているセットからのいくつかのデータポイントを使用した基本的なプロット関数です。

library(rgl)
library(plot3D)
library(car) 

df <- data.frame(meanX = c(147.34694, 173.89244, 135.73004, 121.93766,
                           109.72152,  92.53709, 165.46588, 169.77744,
                           127.01796,  99.34347),
                 meanY = c(140.40816, 110.99128, 134.56023, 164.18703,
                           166.04051, 155.97329, 105.29377, 104.42683,
                           130.17066, 155.99696),
                 avgDist = c(40.788118, 12.957329, 14.24348, 39.10424,
                             34.694258, 25.532335, 21.491695,23.528944,
                             9.309201,  31.916879))

car::scatter3d(x = df$meanX, y = df$meanY, z = df$avgDist, surface = FALSE)

これは正常にプロットされますが、デフォルトの軸範囲を設定します

xlim = c(90,200) 
ylim = c(100,200)
zlim = c(9,40)

問題は、これを完全に変更できないように見えることです。RGL がクリッピングを許可していないことはわかっており、ここでデータ ポイントを除外したくありませんが、軸の範囲は各軸の最大値よりもかなり大きくなっています。

max(df$meanX)
[1] 173.8924

max(df$meanY)
[1] 166.0405

max(df$avgDist)
[1] 40.78812

私がやりたいことは、X と Y の両方の軸の制限を 70 から 185 に設定することです。これは、次のコードで可能にする必要があります。

car::scatter3d(x = df$meanX, y = df$meanY, z = df$avgDist, surface = FALSE,
          xlim = c(70,185), ylim = c(70,185))

ただし、これは同じプロットを生成するだけです (エラーや警告はありません)。これらの軸を手動で設定する方法を知っている人はいますか?

4

1 に答える 1

1

axis.scales = TRUE (現在はデフォルト) の状況では、各軸の最小および最大ラベルと目盛りを設定するコードは、エクスポートされていないcar:::nice関数によって選択されます。axis.scales=FALSE で呼び出してから、軸の目盛りとラベルを追加する作業をやり直すことができます。

with( df,  scatter3d( meanX , meanY, avgDist, axis.scales = FALSE, 
           xlim = c(70,185), ylim = c(70,185), zlim = c(9,40) ))

または、コードを書き直して、xlim、ylim、または zlim パラメータのいずれかが存在するかどうかを確認し、これらの値を car:::scatter3d のこのコードによって設定された値に置き換えることもできます。

car:::scatter3d
#------- code near the top of the console display------
if (axis.scales) {
    lab.min.x <- nice(minx)
    lab.max.x <- nice(maxx)
    lab.min.y <- nice(miny)
    lab.max.y <- nice(maxy)
    lab.min.z <- nice(minz)
    lab.max.z <- nice(maxz)
    minx <- min(lab.min.x, minx)
    maxx <- max(lab.max.x, maxx)
    miny <- min(lab.min.y, miny)
    maxy <- max(lab.max.y, maxy)
    minz <- min(lab.min.z, minz)
    maxz <- max(lab.max.z, maxz)
    min.x <- (lab.min.x - minx)/(maxx - minx)
    max.x <- (lab.max.x - minx)/(maxx - minx)
    min.y <- (lab.min.y - miny)/(maxy - miny)
    max.y <- (lab.max.y - miny)/(maxy - miny)
    min.z <- (lab.min.z - minz)/(maxz - minz)
    max.z <- (lab.max.z - minz)/(maxz - minz)
}

lim値が値の内部にある場合にのみ値を変更できるようにしても問題ないと思いましたniceが、このコードはエラーになるため、リムの欠落を検出するロジックが必要になります。

    lab.min.x <- max( nice(minx), xlim[1])
    lab.max.x <- min( nice(maxx), xlim[2])
    lab.min.y <- max( nice(miny), ylim[1])
    lab.max.y <- min( nice(maxy), ylim[2])
    lab.min.z <- max( nice(minz), zlim[1])
    lab.max.z <- min( nice(maxz), zlim[2])
于 2016-05-25T20:16:19.790 に答える