Построение нескольких поверхностей

#r #plotly

#r #построение

Вопрос:

Я пытаюсь построить несколько поверхностей на одной диаграмме с помощью пакета Plotly, но я просто не могу этого сделать. Несколько дней назад я мог бы сделать это без проблем, используя тот же код, но теперь кажется, что после обновления Plotly это больше невозможно. Вот пример того, что я пытаюсь сделать:

 #Volcano surface
plot_ly(z = volcano,
        type = 'surface') %>%

#First rectangle
add_trace(x = c(10, 60),
          y = c(10, 50),
          z = matrix(160, nrow = 2, ncol = 2),
          type = 'surface', showscale = FALSE) %>%

#Second rectangle
add_trace(x = c(10, 60),
          y = c(10, 50),
          z = matrix(180, nrow = 2, ncol = 2),
          type = 'surface',
          showscale = FALSE)
  

Когда я запускаю приведенный выше код, я получаю следующий вывод:

 Error in p$x$data[[idx]]$marker : 
  $ operator is invalid for atomic vectors
  

Если я назначу объект Plotly некоторой переменной вместо использования оператора ‘%>%’, например:

 #Volcano surface
p <- plot_ly(z = volcano,
             type = 'surface')

#First rectangle
p <- add_trace(p,
               x = c(10, 60),
               y = c(10, 50),
               z = matrix(160, nrow = 2, ncol = 2),
               type = 'surface', showscale = FALSE)

#Second rectangle
p <- add_trace(p,
               x = c(10, 60),
               y = c(10, 50),
               z = matrix(180, nrow = 2, ncol = 2),
               type = 'surface',
               showscale = FALSE)

#Plot object
p
  

… затем я получаю тот же результат, что и раньше.

Если я построю вулкан и только один из прямоугольников, он будет работать просто отлично. Кроме того, я пытался построить поверхности, отличные от прямоугольников, и, тем не менее, я получаю ту же ошибку.

Вот некоторая информация, которая может помочь:

 > sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.1 LTS

locale:
[1] LC_CTYPE=pt_BR.UTF-8       LC_NUMERIC=C               LC_TIME=pt_BR.UTF-8        LC_COLLATE=en_US.UTF-8    
[5] LC_MONETARY=pt_BR.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=pt_BR.UTF-8       LC_NAME=C                 
[9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plotly_4.5.2                  ggplot2_2.1.0                 shiny_0.14.1                  doMC_1.3.4                   
[5] iterators_1.0.8               quantstrat_0.9.1739           foreach_1.4.3                 blotter_0.9.1741             
[9] PerformanceAnalytics_1.4.4000 FinancialInstrument_1.2.0     quantmod_0.4-6                TTR_0.23-1                   
[13] xts_0.9-7                     zoo_1.7-13                   

loaded via a namespace (and not attached):
[1] Rcpp_0.12.7       compiler_3.3.1    plyr_1.8.4        base64enc_0.1-3   tools_3.3.1       digest_0.6.10     viridisLite_0.1.3
[8] jsonlite_1.1      tibble_1.2        gtable_0.2.0      lattice_0.20-34   DBI_0.5-1         yaml_2.1.13       dplyr_0.5.0      
[15] httr_1.2.1        htmlwidgets_0.7   grid_3.3.1        R6_2.1.3          purrr_0.2.2       tidyr_0.6.0       magrittr_1.5     
[22] scales_0.4.0      codetools_0.2-14  htmltools_0.3.5   assertthat_0.1    mime_0.5          xtable_1.8-2      colorspace_1.2-6 
[29] httpuv_1.3.3      lazyeval_0.2.0    munsell_0.4.3  
  

Есть мысли по этому поводу?

Ответ №1:

Решаемая. Переписал код для:

 #Create Plotly object
plot_ly(showscale = FALSE) %>%

#Volcano surface    
add_surface(z = volcano) %>%

#First rectangle
add_surface(x = c(10, 60),
            y = c(10, 50),
            z = matrix(160, nrow = 2, ncol = 2)) %>%

#Second rectangle
add_surface(x = c(10, 60),
            y = c(10, 50),
            z = matrix(180, nrow = 2, ncol = 2))
  

Работает как шарм. Сделал это на основе этого примера построения нескольких поверхностей.