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

如何基于Excel实时统计数据在ShinyDashboard中实现动态柱状图展示

解决方案:在ShinyDashboard中实现实时数据驱动的动态柱状图

没问题,我帮你调整代码来实现这个需求。既然你没法预设年底的目标数值,直接用柱状图展示当前的实时记录数就非常合适——不需要固定的最大值,图表会随着每次读取的Excel数据自动更新高度。下面是修改后的完整代码,我会一步步解释改动点:

修改后的完整代码

library(shinydashboard)
library(shiny)
library(DT)
library(shinyWidgets)
library(dplyr)
library(readxl)
library(ggplot2) # 新增:用于绘制美观的柱状图

# 每次启动应用时读取最新的Excel数据
tbl1 <- read_excel('Test1.XLSX')

ui <- dashboardPage(
  dashboardHeader(disable = TRUE),
  dashboardSidebar(disable = TRUE),
  dashboardBody(
    fluidPage(
      # 替换原来的数值框为图表输出,设置合适的高度
      plotOutput("count_bar", height = "300px")
    )
  )
)

server <- function(input, output, session) {
  # 响应式计算总记录数
  total_data <- reactive({
    sum(tbl1$TOTAL)
  })
  
  # 渲染动态柱状图
  output$count_bar <- renderPlot({
    # 构造用于绘图的数据框
    plot_data <- data.frame(
      统计项 = "2021 总记录数",
      记录数量 = total_data()
    )
    
    ggplot(plot_data, aes(x = 统计项, y = 记录数量)) +
      geom_col(fill = "#2E86AB", width = 0.5) + # 设置柱子的颜色和宽度
      geom_text(aes(label = 记录数量), vjust = -0.5, size = 5) + # 在柱子顶部显示具体数值
      labs(title = "实时总记录统计", y = "记录数量", x = "") + # 设置标题和坐标轴标签
      theme_minimal() +
      theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.text.y = element_text(size = 12),
        axis.title.y = element_text(size = 14)
      ) +
      ylim(0, total_data() * 1.1) # 自动调整y轴范围,确保数值标签不超出图表
  })
}

shinyApp(ui, server)

关键改动说明

  1. 新增可视化库:引入ggplot2来生成美观且灵活的柱状图,比基础绘图功能更易定制样式。
  2. 替换UI组件:把原来的valueBoxOutput换成plotOutput,专门用于展示动态图表。
  3. 动态图表渲染:
    • 用renderPlot生成柱状图,数据源是从Excel读取的实时总记录数。
    • 通过ylim(0, total_data() * 1.1)自动调整y轴范围,完全不需要预设最大值——它会根据当前的记录数自动适配,确保柱子和顶部的数值标签都能完整显示。
    • 添加了柱子顶部的数值标签,让数据展示更直观;同时调整了主题样式,让图表更专业整洁。

可选:自动定时刷新数据

如果之后你希望不用重启应用,就能定期读取Excel的最新数据,可以添加定时器功能。只需要修改服务器端的total_data响应式对象:

server <- function(input, output, session) {
  # 设置定时器,每5分钟(300000毫秒)刷新一次数据
  auto_refresh <- reactiveTimer(300000)
  
  # 每次定时器触发时重新读取数据并计算总数
  total_data <- reactive({
    auto_refresh() # 触发定时器
    tbl1 <- read_excel('Test1.XLSX') # 重新读取最新Excel数据
    sum(tbl1$TOTAL)
  })
  
  # 下面的renderPlot部分保持不变...
}

这样应用会自动每隔5分钟更新一次柱状图,完全不需要手动干预。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:47:36