我在使用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))
但这只会产生相同的情节(没有错误或警告)。有人知道如何手动设置这些轴吗?
答案 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])