R Shiny to select traces for Plotly line chart?

跟風遠走 提交于 2019-12-07 18:07:04

问题


I am trying to use Shiny to select variables I want to plot in a multi-line chart rendered using Plotly. I have many variables so I want to select using Shiny instead of using Plotly's interactive legend "click" selection mechanism. Example Data:

library(plotly)                       
# Example dataframe
foo <-data.frame( mon  = c("Jan", "Feb", "Mar"),
                  var_1 = c(100, 200, 300),
                  var_b = c(80, 250, 280),
                  var_three = c(150, 120,201)
                )

When using Plotly directly I can manually add traces using code like this:

p <- plot_ly(x = foo$mon, y = foo$var_1, line = list(shape="linear"))
p <- add_trace(p, x = foo$mon, y = foo$var_b)
p <- add_trace(p, x = foo$mon, y = foo$var_three)
print(p)

Now I want to use a Shiny checkbox to select the variables I wish to see on the plot. The selection is captured in input$show_vars , but how do I loop through and plot this changing list of variables? Here is my app.R code that manually plots one of the variables. Suggestions appreciated!

#------------------------------------------------------------------------------
# UI 
#------------------------------------------------------------------------------
ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            checkboxGroupInput('show_vars', 'Columns in the dataset', names(foo),
                               selected = c('mon', 'var_1')),
            helpText('Select the variables to show in the graph.')
        ),
        mainPanel(
            plotlyOutput("myPlot")
        )
    )
)
#------------------------------------------------------------------------------
# SERVER 
# Need to loop through input$show_vars to show a trace for each one?
#------------------------------------------------------------------------------
server <- function(input, output) {
    # a large table, reative to input$show_vars
    output$uteTable = renderDataTable({
        library(ggplot2)
        ute[, input$show_vars, drop = FALSE]
    })

    output$myPlot = renderPlotly({
        plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
        ## How to add the other traces selected in input$show_vars??
    })
}
shinyApp(ui = ui, server = server)

UPDATE: I realize now that I need the script to avoid hard-coding the first plot to use foo$var_1. The plot should use any one of the possible selections in the checkboxes (minus $mon, which I have removed from the select list). When I try to make the first plot statement conditional I get the message "Error: The last plot does not exist." ie, this does not work:

output$myPlot = renderPlotly({
    # p <- plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
    for (item in input$show_vars) {
        if (item == 1){
            p <- plot_ly(x=foo$mon, y=foo[[item]], line = list(shape="linear"))
        }
        if(item > 1){
           p <- add_trace(p, x = foo$mon, y = foo[[item]], evaluate = TRUE)
        }
    }
    print(p)

回答1:


See if this is what you want. Also you probably want to remove the first two items in the checkboxGroup so that they are not removable (depending on what you want).

output$myPlot = renderPlotly({
    p <- plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
    ## How to add the other traces selected in input$show_vars??
    for (item in input$show_vars) {
        p <- add_trace(p, x = foo$mon, y = foo[[item]], evaluate = TRUE)
    }
    print(p)
})


来源:https://stackoverflow.com/questions/36799857/r-shiny-to-select-traces-for-plotly-line-chart

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!