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

Shiny仪表板图表加载异常及产品类别选择无响应问题排查

问题修复方案

问题分析

你遇到两个核心问题:

  1. 初始加载的图表中,每个X轴月份对应多个数值点,线条混乱
  2. 选择产品类别后,图表没有任何变化

问题原因

  1. X轴多数值问题:数据中每个月份对应不同年份的销售数据,且初始图表未按年份/类别区分分组,同时group参数错误绑定了input$Category(初始未选择时为NULL),导致ggplot无法正确识别分组逻辑,将所有数据点连在一起。
  2. 选择无响应问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:10:57