繁体   English   中英

在 shiny R 中使用 plotly 的多线图

[英]Multiple line graphs using plotly in shiny R

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

  1. 第一个下拉菜单将输入到 select 的数据集。

  2. 第二个下拉框将输入 select 来自所选数据集中的变量。 然而,我已经弄清楚的大多数事情,y 轴 label 不会动态变化。 label 正在获取(输入$变量)而不是温度或重量。

这是 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)

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


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))

)

编辑:在评论之后,这里是如何 plot 如果选择了两个变量,则为两行,否则为另一行(不要忘记在selectInput()中放置multiple = TRUE

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 轴 label 。 请注意,此答案仅在有两种选择时才有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM