如何创建带滑块控制的多直方图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
相关产品推荐
相关产品推荐

