【问题标题】:Multiple line graphs using plotly in shiny R在闪亮的 R 中使用 plotly 的多线图
【发布时间】:2020-09-30 01:37:12
【问题描述】:

我是闪亮的 R 和 Plotly 的新手。我正在尝试构建一个具有两个下拉框的仪表板,我们通过这些下拉框获取输入并绘制 Plotly 图。所有数据集都有时间、温度和重量列。时间在 x 轴上,对于 y 轴,我们可以选择温度或重量,或者两者兼而有之。

  1. 第一个下拉菜单接受要选择的数据集的输入。

  2. 第二个下拉框接受输入以从所选数据集中选择变量。 然而,我已经弄清楚的大多数事情,y 轴标签不会动态变化。标签正在获取 (input$variable) 而不是 temp 或 weight。

here is the shiny r output 这也是可重现的示例和我的代码

library(shiny)
library(plotly)
library(DT)

df1 <- data.frame("time" = 1:10, "temp" = c(21,15,31,12,23,45,67,34,54,10), "weight" = c(10,20,30,40,65,35,68,89,100,23), stringsAsFactors = FALSE)
df2 <- data.frame("time" = 1:10, "temp" = c(31,65,31,22,23,45,67,54,54,45), "weight" = c(30,20,40,40,65,85,68,89,14,24), stringsAsFactors = FALSE)





    ui <- fluidPage(

            titlePanel( div(column(width = 5, h2('title here')), )),
            # Input: Selector for choosing dataset
            selectInput(inputId = "dataset",
                        label = "Choose a dataset:",
                        choices = c("df1","df2")),

            selectInput(inputId = "variable",
                        label = "Variable selection", 
                        choices = c("temp","weight"),
                        selected = "weight",
                        multiple = FALSE),
            mainPanel(
                    # Output
                    tabsetPanel(type = "tabs",
                                tabPanel("Plot", plotlyOutput('plot')),
                                tabPanel("Data", DT::dataTableOutput("table")),
                                tabPanel("Key_metrics", DT::dataTableOutput("Key_metrics")))
            )
    )

    server <- function(input, output) {
            dataDf <- reactive({
                    temp <- get(input$dataset)

            })

            output$plot <- renderPlotly(
                    plot_ly(dataDf(), x = ~time, y =~get(input$variable), type = 'scatter', mode = 'lines', name = "temp") %>%
                            add_trace(dataDf(), x = ~time, y = ~weight, type = 'scatter', mode = 'lines',name = "weight") 

            )

            output$table <- DT::renderDataTable({
                    dataDf()
            })
            output$Key_metrics <- DT::renderDataTable({

            })

    }

    shinyApp(ui,server)

【问题讨论】:

    标签: r shiny r-plotly


    【解决方案1】:

    您可以在layout() 中指定轴标签。请注意,xaxisyaxis 需要一个列表作为参数(有关详细信息,请参阅 here):

    
    output$plot <- renderPlotly(
        plot_ly(dataDf(), x = ~time, y =~get(input$variable), type = 'scatter', mode = 'lines', name = "temp") %>%
          add_trace(dataDf(), x = ~time, y = ~weight, type = 'scatter', mode = 'lines',name = "weight") %>%
          layout(xaxis = list(title = "Time"), yaxis = list(title = input$variable))
    
    )
    

    编辑:在评论之后,如果选择了两个变量,则绘制两条线,否则绘制两条线(不要忘记将multiple = TRUE 放入selectInput()

    library(shiny)
    library(plotly)
    library(DT)
    
    df1 <- data.frame("time" = 1:10, "temp" = c(21,15,31,12,23,45,67,34,54,10), "weight" = c(10,20,30,40,65,35,68,89,100,23), stringsAsFactors = FALSE)
    df2 <- data.frame("time" = 1:10, "temp" = c(31,65,31,22,23,45,67,54,54,45), "weight" = c(30,20,40,40,65,85,68,89,14,24), stringsAsFactors = FALSE)
    
    
    
    ui <- fluidPage(
    
      titlePanel( div(column(width = 5, h2('title here')), )),
      # Input: Selector for choosing dataset
      selectInput(inputId = "dataset",
                  label = "Choose a dataset:",
                  choices = c("df1","df2")),
    
      selectInput(inputId = "variable",
                  label = "Variable selection", 
                  choices = c("temp","weight"),
                  selected = "weight",
                  multiple = TRUE),
      mainPanel(
        # Output
        tabsetPanel(type = "tabs",
                    tabPanel("Plot", plotlyOutput('plot')),
                    tabPanel("Data", DT::dataTableOutput("table")),
                    tabPanel("Key_metrics", DT::dataTableOutput("Key_metrics")))
      )
    )
    
    server <- function(input, output) {
      dataDf <- reactive({
        temp <- get(input$dataset)
    
      })
    
      output$plot <- renderPlotly({
    
        if (length(input$variable) > 1){
          plot_ly(dataDf(), x = ~time, y =~get(input$variable[1]), 
                  type = 'scatter', mode = 'lines', name = "temp") %>%
            add_trace(dataDf(), x = ~time, y = ~get(input$variable[2]), 
                      type = 'scatter', mode = 'lines',name = "weight") %>%
            layout(xaxis = list(title = "Time"))
        }
        else {
          plot_ly(dataDf(), x = ~time, y =~get(input$variable[1]), type = 'scatter', mode = 'lines', name = "temp") %>%
            add_trace(dataDf(), x = ~time, y = ~get(input$variable[1]), type = 'scatter', mode = 'lines',name = "weight") %>%
            layout(xaxis = list(title = "Time"), yaxis = list(title = input$variable))
        }
    
      })
    
      output$table <- DT::renderDataTable({
        dataDf()
      })
      output$Key_metrics <- DT::renderDataTable({
    
      })
    
    }
    
    shinyApp(ui,server)
    

    根据原始答案将您想要的内容作为 y 轴标签。请注意,此答案仅在有两种选择时才有效。

    【讨论】:

    • 非常感谢。它解决了这个问题。但是,如果您能提供帮助,我有一个后续问题。对于变量选择下拉菜单,我计划进行多项选择。因此,如果我选择 temp,则仅应绘制 temp,如果我选择 weight,则应仅绘制 weight。如果我同时选择温度和重量,那么两者都应该被绘制。有办法吗?
    • 我认为 Y 轴应该是“价值”而不是重量
    • @DanielJachetta 感谢您的评论。但是,bretauv 已经提供了帮助,所以我无法尝试您的建议。
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 2019-01-02
    • 2020-03-12
    • 2021-11-17
    • 1970-01-01
    • 2020-03-30
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多