Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R plotly 3d bar plot

Tags:

r

shiny

plotly

For interactive 3D plots embedded in R shiny outputs, the R package plotly now offers some good options, especially as the maintenance of the alternative shiny-rgl package seems to be fading recently.

However, is it possible to create a 3d barplot using plotly?

like image 424
martin Avatar asked Jun 30 '26 16:06

martin


1 Answers

One trick to create the appearance of a 3d barplot is to plot error bars instead.

As commented in the below code, values of the dimension for which bars are desired are halved before supplying them via add_trace, where they are resized to anything below visibility (or making them transparent). The symmetric error bars of the halved values then simply lead to bars. Two groups of data df1 and df2 are added in the below example.

library(shiny)
library(plotly)

ui <- fluidPage(
    plotlyOutput("plotlii", width = "100%", height = "700px")
)

server <- function(input, output) {
    output$plotlii <- renderPlotly({
        # the data:     
        obs1 <- matrix(ncol=3,
            c(1,2,3,1,2,2,6,6,4)
        )
        df1 <- setNames(data.frame(obs1), c("a", "b", "c"))
        df1$c<-(.5*df1$c) # half values to make them the centre point of the bars
        obs2 <- matrix(ncol=3,
            c(14,16,10,11,12,12,23,23,22)
        )
        df2 <- setNames(data.frame(obs2), c("a", "b", "c"))
        df2$c<-(.5*df2$c) # half values to make them the centre point of the bars
        # the plot:
        p <- plot_ly(type="scatter3d",mode="markers",showlegend=FALSE)%>%
        add_trace(p,
            x = ~a, y = ~b, z = ~c,
            data = df1,
            color=I("red"),
            size = I(1),
            name = "Group a",
            error_z=list(
                color="red",
                thickness=0,
                symmetric = TRUE, 
                type = "data" ,
                array = df1$c
            )
        )%>%
        add_trace(p,
            x = ~a, y = ~b, z = ~c,
            data = df2,
            color=I("gray"),
            size = I(1),
            name = "Group a",
            error_z=list(
                color="gray",
                symmetric = TRUE, 
                type = "data" ,
                array = df2$c
            )
        )   
    })
}

shinyApp(ui, server)

enter image description here

like image 69
martin Avatar answered Jul 02 '26 08:07

martin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!