Shiny仪表板图表加载异常及产品类别选择无响应问题排查
问题修复方案
问题分析
你遇到两个核心问题:
- 初始加载的图表中,每个X轴月份对应多个数值点,线条混乱
- 选择产品类别后,图表没有任何变化
问题原因
- X轴多数值问题:数据中每个月份对应不同年份的销售数据,且初始图表未按年份/类别区分分组,同时
group参数错误绑定了input$Category(初始未选择时为NULL),导致ggplot无法正确识别分组逻辑,将所有数据点连在一起。 - 选择无响应问题:
renderPlot中始终使用完整的sales_graph1数据集,没有根据用户选择的input$Category过滤数据,也没有正确映射类别到图表的分组/颜色属性。
数据片段
structure(list(Order_Year = c("2019", "2020", "2019", "2020", "2019", "2020", "2019", "2020", "2019", "2020"), Order_Month = c("01", "01", "02", "02", "03", "03", "04", "04", "05", "05"), Category = c("Furniture", "Furniture", "Furniture", "Furniture", "Furniture", "Furniture", "Furniture", "Furniture", "Furniture", "Furniture"), Sales = c(7698, 7246, 3926, 9212, 12799, 12993, 13216, 11416, 15123, 22800)), row.names = c(NA, 10L), class = "data.frame")
修复后的完整代码
library(shiny) library(readxl) library(readr) library(dplyr) library(stringr) library(ggplot2) library(shinyWidgets) # 读取数据 superstore_sales <- read_csv("superstore_sales.csv") # 提取年月并重命名 superstore_sales <- superstore_sales %>% mutate( Order_Year = str_sub(order_date, -4,-1), Order_Month = str_sub(order_date, -7, -6) ) # 聚合销售数据(用dplyr更清晰) sales_graph1 <- superstore_sales %>% group_by(Order_Year, Order_Month, Category) %>% summarise(Sales = sum(sales, na.rm = TRUE), .groups = "drop") ui <- fluidPage( titlePanel("Superstore Performance Summary"), wellPanel( fluidRow( h4("Overall Performance"), sidebarPanel( pickerInput( inputId = "Category", label = "Category", choices = unique(sales_graph1$Category), options = list(`actions-box` = TRUE), multiple = TRUE, selected = unique(sales_graph1$Category) # 默认选中所有类别 ) ), mainPanel(plotOutput("plot")) ) ), wellPanel(fluidRow("TBD")) ) server <- function(input, output) { # 响应式过滤数据 filtered_data <- reactive({ if (is.null(input$Category)) { sales_graph1 } else { sales_graph1 %>% filter(Category %in% input$Category) } }) output$plot <- renderPlot({ ggplot(filtered_data(), aes(x = paste(Order_Year, Order_Month, sep = "-"), y = Sales, color = Category, group = interaction(Category, Order_Year))) + geom_line(linewidth = 1) + labs(x = "年月", y = "销售额") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) }) } shinyApp(ui = ui, server = server)
关键修复点
- 数据过滤:新增reactive对象
filtered_data,根据用户选择的类别动态过滤数据集 - 分组逻辑:将
group设置为interaction(Category, Order_Year),确保每个类别+年份的组合生成独立线条,解决X轴多数值混乱问题 - 初始状态优化:设置
pickerInput的selected参数默认选中所有类别,避免初始无数据的情况 - 时间轴优化:将X轴改为
年月组合格式,避免同月份不同年份的数据重叠 - 可视化提升:添加颜色区分类别,调整X轴标签角度提升可读性
内容的提问来源于stack exchange,提问作者HL4
相关产品推荐
相关产品推荐

