如何在汽车/ RGL 3D图上设置轴限制?特别是scatter3d

时间:2016-05-25 19:09:42

标签: r rgl r-car

我在使用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))

但这只会产生相同的情节(没有错误或警告)。有人知道如何手动设置这些轴吗?

1 个答案:

答案 0 :(得分: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中的这段代码所设置的值:< / p>

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])