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

如何创建带滑块控制的多直方图ShinyApp?基于鸢尾花数据集

Shiny 实现 Iris 数据集带滑块过滤的直方图

下面是完整的代码实现,包含UI和Server部分,重点说明Server端的核心逻辑:

完整代码

library(shiny)
library(ggplot2)

# UI部分
ui <- fluidPage(
  titlePanel("Iris 变量直方图过滤"),
  fluidRow(
    column(3,
           sliderInput("sepal_length_max", "Sepal.Length 最大值",
                       min = min(iris$Sepal.Length), max = max(iris$Sepal.Length),
                       value = max(iris$Sepal.Length), step = 0.1)
    ),
    column(3,
           sliderInput("sepal_width_max", "Sepal.Width 最大值",
                       min = min(iris$Sepal.Width), max = max(iris$Sepal.Width),
                       value = max(iris$Sepal.Width), step = 0.1)
    ),
    column(3,
           sliderInput("petal_length_max", "Petal.Length 最大值",
                       min = min(iris$Petal.Length), max = max(iris$Petal.Length),
                       value = max(iris$Petal.Length), step = 0.1)
    ),
    column(3,
           sliderInput("petal_width_max", "Petal.Width 最大值",
                       min = min(iris$Petal.Width), max = max(iris$Petal.Width),
                       value = max(iris$Petal.Width), step = 0.1)
    )
  ),
  fluidRow(
    column(6, plotOutput("sepal_length_hist")),
    column(6, plotOutput("sepal_width_hist"))
  ),
  fluidRow(
    column(6, plotOutput("petal_length_hist")),
    column(6, plotOutput("petal_width_hist"))
  )
)

# Server部分
server <- function(input, output) {
  # Sepal.Length 直方图
  output$sepal_length_hist <- renderPlot({
    # 过滤数据:保留Sepal.Length小于等于滑块最大值的行
    filtered_data <- iris[iris$Sepal.Length <= input$sepal_length_max, ]
    ggplot(filtered_data, aes(x = Sepal.Length)) +
      geom_histogram(bins = 15, fill = "#2c3e50", color = "white") +
      xlim(min(iris$Sepal.Length), input$sepal_length_max) +
      labs(title = "Sepal.Length 直方图", x = "Sepal.Length", y = "频数") +
      theme_minimal()
  })
  
  # Sepal.Width 直方图
  output$sepal_width_hist <- renderPlot({
    filtered_data <- iris[iris$Sepal.Width <= input$sepal_width_max, ]
    ggplot(filtered_data, aes(x = Sepal.Width)) +
      geom_histogram(bins = 15, fill = "#e74c3c", color = "white") +
      xlim(min(iris$Sepal.Width), input$sepal_width_max) +
      labs(title = "Sepal.Width 直方图", x = "Sepal.Width", y = "频数") +
      theme_minimal()
  })
  
  # Petal.Length 直方图
  output$petal_length_hist <- renderPlot({
    filtered_data <- iris[iris$Petal.Length <= input$petal_length_max, ]
    ggplot(filtered_data, aes(x = Petal.Length)) +
      geom_histogram(bins = 15, fill = "#27ae60", color = "white") +
      xlim(min(iris$Petal.Length), input$petal_length_max) +
      labs(title = "Petal.Length 直方图", x = "Petal.Length", y = "频数") +
      theme_minimal()
  })
  
  # Petal.Width 直方图
  output$petal_width_hist <- renderPlot({
    filtered_data <- iris[iris$Petal.Width <= input$petal_width_max, ]
    ggplot(filtered_data, aes(x = Petal.Width)) +
      geom_histogram(bins = 15, fill = "#f39c12", color = "white") +
      xlim(min(iris$Petal.Width), input$petal_width_max) +
      labs(title = "Petal.Width 直方图", x = "Petal.Width", y = "频数") +
      theme_minimal()
  })
}

shinyApp(ui = ui, server = server)

Server端核心逻辑说明

  • 每个直方图对应一个renderPlot函数,实时响应滑块的输入变化
  • 数据过滤:通过iris[iris$变量名 <= input$滑块输入ID, ]筛选出符合条件的数据行
  • 绘制直方图时,用xlim固定x轴范围为变量最小值到当前滑块的最大值,确保图表只显示过滤后的区间数据
  • 用ggplot2绘制直方图,可根据需求调整bins(组数)、颜色等样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:05:19