将Shiny滑块集成到ggplot图表:基于温度风速过滤数据
如何用Shiny滑块过滤NFL四分卫比赛数据框
要实现用滑块选择温度和风速范围来过滤数据框,你需要在Shiny的server端创建反应式数据对象,基于滑块输入值对原始数据进行筛选,之后用筛选后的数据绘制图表。具体修改步骤如下:
关键修改点
- 用
reactive()函数创建动态更新的过滤后数据框,响应滑块输入变化 - 使用
dplyr::filter()根据滑块的范围值(滑块返回长度为2的向量,对应最小值和最大值)筛选temperature和wind列 - 绘图时用这个反应式数据框替代原始的
df
修改后的完整代码
library(shiny) library(dplyr) library(ggplot2) library(tidyr) df = read.csv("Combined_QB_Game_Data.csv") df[df == "--"] = NA df$Passes.Completed = as.double(df$Passes.Completed) df$Passes.Attempted = as.double(df$Passes.Attempted) df$Completion.Percentage = as.double(df$Completion.Percentage) df$Passing.Yards = as.double(df$Passing.Yards) df$Passing.Yards.Per.Attempt = as.double(df$Passing.Yards.Per.Attempt) df$TD.Passes = as.double(df$TD.Passes) df$Sacks = as.double(df$Sacks) ui = fluidPage( titlePanel("QB Performance"), sidebarLayout( sidebarPanel( selectInput(inputId = "x", label = "Options:", choices = c("Ht", "Wt", "Forty", "Vertical", "BenchReps", "BroadJump", "Cone", "Shuttle", "Round", "Pick"), selected = "Ht"), selectInput(inputId = "y", label = "Options2:", choices = c("Passer.Rating","Passes.Completed","Passes.Attempted","Completion.Percentage","Passing.Yards","Passing.Yards.Per.Attempt","TD.Passes","Ints","Sacks"), selected = "Passer.Rating"), # 修正拼写错误:Tempurature → Temperature sliderInput("z", "Temperature", min = 0, max = 100, value = c(25, 75)), sliderInput("a", "Wind", min = 0, max = 30, value = c(5, 25)) ), mainPanel( plotOutput(outputId = "scatterplot") ) ) ) server = function(input, output) { # 创建反应式过滤数据框 filtered_df = reactive({ df %>% filter( # 温度在滑块选择的最小值和最大值之间 temperature >= input$z[1], temperature <= input$z[2], # 风速在滑块选择的最小值和最大值之间 wind >= input$a[1], wind <= input$a[2] ) }) output$scatterplot = renderPlot({ # 使用过滤后的反应式数据绘图 p = ggplot(data = filtered_df()) + aes_string(x = input$x, y = input$y) + geom_point()+ geom_smooth(method = "lm") plot(p) }) } shinyApp(ui, server)
代码解释
- 反应式数据框
filtered_df:它会在滑块输入变化时自动重新计算,确保每次绘图用的都是最新筛选的数据 - 滑块值的使用:
input$z返回长度为2的向量,input$z[1]是温度范围最小值,input$z[2]是最大值;风速滑块input$a同理 - 数据筛选逻辑:用
filter()函数保留temperature和wind列落在对应滑块范围内的行,确保只有符合天气条件的比赛数据被用于绘图
内容的提问来源于stack exchange,提问作者Josh Cochrane
相关产品推荐
相关产品推荐

