You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码解释

  1. 反应式数据框filtered_df:它会在滑块输入变化时自动重新计算,确保每次绘图用的都是最新筛选的数据
  2. 滑块值的使用:input$z返回长度为2的向量,input$z[1]是温度范围最小值,input$z[2]是最大值;风速滑块input$a同理
  3. 数据筛选逻辑:用filter()函数保留temperature和wind列落在对应滑块范围内的行,确保只有符合天气条件的比赛数据被用于绘图

内容的提问来源于stack exchange,提问作者Josh Cochrane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:50:27