使用动态输入字段绘制交互式图表
Interactive charts in plotly using dynamic input fields
我正在尝试创建一个带有下拉菜单的图表,用户可以在其中 select 在图表上显示什么(就像 Power BI 图表中的 'filter',但我想留在R)。所以我选择 Shiny 和 Plotly(欢迎任何其他建议!)。
大多数教程都指向对输入 selections 进行硬编码,但我有数千个 selections,因此我希望从我的数据源中的字段动态生成此列表。这是到目前为止我所做的示例,我希望下拉菜单让用户 select 在 Home 1 和 Home 2 之间:
library(shiny)
library(plotly)
df <- data.frame(Name = c("Home 1", "Home 1", "Home 2", "Home 2"), Rating = c("Good", "Excellent", "Good", "Good"),
Date = c("2016-07-14", "2016-08-14", "2016-07-14", "2016-08-14"))
# Get a basic shiny app working with dropdowns
ui <- fluidPage(
plotlyOutput("plot"),
selectInput(df$Name, "Select Name", df$Name),
verbatimTextOutput("event")
)
server <- function(input, output) {
output$plot <- renderPlotly({
plot_ly(df, x = df$Date, y = df$Rating, type = 'scatter', mode = 'line')
})
output$event <- renderPrint({
d <- event_data("plotly_hover")
if (is.null(d)) "Hover on a point!" else d
})
}
shinyApp(ui, server)
我不知道将 selectInput()
的 selected 输入放到 plot_ly()
函数的什么地方,所以这段代码显然会抛出一堆警告并且不起作用.
Warning in if (!is.na(attribValue)) { :
the condition has length > 1 and only the first element will be used
Warning in charToRaw(enc2utf8(text)) :
argument should be a character vector of length 1
all but the first element will be ignored
我觉得我很接近,但我已经筋疲力尽了,基本上需要比我更擅长这方面的人来为我指明正确的方向。
或者有没有比 shiny & plotly 更好的使用包的方法?
谢谢
以下是我的处理方法:
library(shiny)
library(plotly)
df <- data.frame(Name = c("Home 1", "Home 1", "Home 2", "Home 2"), Rating = c("Good", "Excellent", "Good", "Good"),
Date = c("2016-07-14", "2016-08-14", "2016-07-14", "2016-08-14"))
# Get a basic shiny app working with dropdowns
ui <- fluidPage(
plotlyOutput("plot"),
selectInput("SelectName", "Select Name", df$Name, selected = unique(df$Name), multiple = TRUE),
verbatimTextOutput("event")
)
server <- function(input, output) {
filteredDf <- reactive({
req(input$SelectName)
df[df$Name %in% input$SelectName, ]
})
output$plot <- renderPlotly({
plot_ly(filteredDf(), x = ~Date, y = ~Rating, type = 'scatter', mode = 'line', color = ~Name)
})
output$event <- renderPrint({
d <- event_data("plotly_hover")
if (is.null(d)) "Hover on a point!" else d
})
}
shinyApp(ui, server)
您需要从您的 df
(我称之为 filteredDf
)
创建一个反应式(过滤的)数据集
我正在尝试创建一个带有下拉菜单的图表,用户可以在其中 select 在图表上显示什么(就像 Power BI 图表中的 'filter',但我想留在R)。所以我选择 Shiny 和 Plotly(欢迎任何其他建议!)。
大多数教程都指向对输入 selections 进行硬编码,但我有数千个 selections,因此我希望从我的数据源中的字段动态生成此列表。这是到目前为止我所做的示例,我希望下拉菜单让用户 select 在 Home 1 和 Home 2 之间:
library(shiny)
library(plotly)
df <- data.frame(Name = c("Home 1", "Home 1", "Home 2", "Home 2"), Rating = c("Good", "Excellent", "Good", "Good"),
Date = c("2016-07-14", "2016-08-14", "2016-07-14", "2016-08-14"))
# Get a basic shiny app working with dropdowns
ui <- fluidPage(
plotlyOutput("plot"),
selectInput(df$Name, "Select Name", df$Name),
verbatimTextOutput("event")
)
server <- function(input, output) {
output$plot <- renderPlotly({
plot_ly(df, x = df$Date, y = df$Rating, type = 'scatter', mode = 'line')
})
output$event <- renderPrint({
d <- event_data("plotly_hover")
if (is.null(d)) "Hover on a point!" else d
})
}
shinyApp(ui, server)
我不知道将 selectInput()
的 selected 输入放到 plot_ly()
函数的什么地方,所以这段代码显然会抛出一堆警告并且不起作用.
Warning in if (!is.na(attribValue)) { :
the condition has length > 1 and only the first element will be used
Warning in charToRaw(enc2utf8(text)) :
argument should be a character vector of length 1
all but the first element will be ignored
我觉得我很接近,但我已经筋疲力尽了,基本上需要比我更擅长这方面的人来为我指明正确的方向。
或者有没有比 shiny & plotly 更好的使用包的方法?
谢谢
以下是我的处理方法:
library(shiny)
library(plotly)
df <- data.frame(Name = c("Home 1", "Home 1", "Home 2", "Home 2"), Rating = c("Good", "Excellent", "Good", "Good"),
Date = c("2016-07-14", "2016-08-14", "2016-07-14", "2016-08-14"))
# Get a basic shiny app working with dropdowns
ui <- fluidPage(
plotlyOutput("plot"),
selectInput("SelectName", "Select Name", df$Name, selected = unique(df$Name), multiple = TRUE),
verbatimTextOutput("event")
)
server <- function(input, output) {
filteredDf <- reactive({
req(input$SelectName)
df[df$Name %in% input$SelectName, ]
})
output$plot <- renderPlotly({
plot_ly(filteredDf(), x = ~Date, y = ~Rating, type = 'scatter', mode = 'line', color = ~Name)
})
output$event <- renderPrint({
d <- event_data("plotly_hover")
if (is.null(d)) "Hover on a point!" else d
})
}
shinyApp(ui, server)
您需要从您的 df
(我称之为 filteredDf
)