Как установить границы осей на 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])
Другие вопросы по тегам