2017-12-16 488 views
8

Chciałbym wykreślić 3D-Line Plot z Plotly dla serii czasowych i wypełnić pod każdą linię. Mam tutaj przykładowy kod.Plotly 3D wypełnienie pod linią

library(plotly) 

dens <- with(diamonds, tapply(price, INDEX = cut, density)) 
data <- data.frame(
    x = unlist(lapply(dens, "[[", "x")), 
    y = unlist(lapply(dens, "[[", "y")), 
    cut = rep(names(dens), each = length(dens[[1]]$x))) 

p <- plot_ly(data, x = ~cut, y = ~x, z = ~y, type = 'scatter3d', mode = 'lines', color = ~cut) 
p 

z tym kodem można produkować ten spisek

3d wykres liniowy bez wypełnienia

enter image description here

Próbowałem już surfaceaxis=0, 1 lub 2, a one produkowane źle wypełnień.

3D Plotly ze złego wypełnienia

enter image description here

Co chcę to wypełnić obszary pomiędzy oś X i linii działek.

istnieje przykładowy wykres 3D z innymi wartościami.

Jako przykład 3D działka o wypełnienie pod krzywymi dla kolejnych wartości

enter image description here

Czy ktoś mógłby sugerować metodę? Z góry dziękuję.

Edit: To musi być tworzone z pakietu "plotly"

Odpowiedz

2

Aktualizacja:

To powinno działać dla ciebie;

rle_x <- rle(as.numeric(factor(data$cut)))$lengths 

mcolor <- c("red","blue","green","purple", "yellow")  

data$mcolor<-rep(mcolor[seq_along(rle_x)],times = rle_x) 

cloud(y~x+cut, data, panel.3d.cloud=panel.3dbars, 
     xbase=0.4, ybase=0.4, scales=list(arrows=FALSE, col=1), 
     par.settings = list(axis.line = list(col = "transparent")), 
     col.facet = data$mcolor, 
     col = data$mcolor) 

enter image description here

Pierwsza edycja odpowiedź:

Można spróbować użyć latticeExtra::cloud. Oczywiście, nie da interaktywnej fabuły jak plotly.

cloud(y~x+cut, data, panel.3d.cloud=panel.3dbars, 
     xbase=0.4, ybase=0.4, scales=list(arrows=FALSE, col=1), 
     par.settings = list(axis.line = list(col = "transparent"))) 

enter image description here

2

Jeśli jesteś ok z pseudo-3D, można zrobić RIDGELINE wykres gęstości. Wierzę, że dostępna jest również sprytna wersja.

Nota prawna: Jestem autorem pakietu ggridges.

library(ggplot2) 
library(ggridges) 

ggplot(diamonds, aes(x = price, y = cut, fill = cut)) + 
    geom_density_ridges(scale = 2, alpha = 0.7) + 
    scale_fill_brewer(guide = guide_legend(reverse = TRUE)) + 
    scale_y_discrete(expand = c(0.01, 0)) + 
    theme_ridges(center = TRUE) 

enter image description here