Как установить границы осей на 3D-графиках автомобилей /RGL? конкретно scatter3d
У меня возникли некоторые проблемы с использованием 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 ответ
В ситуациях, когда 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])