如何用Plotly绘制多动态环形图?超6个时显示下拉箭头
实现带下拉切换的多动态环形图(Donut Chart)
当然可以实现!结合Shiny的交互组件和Plotly的可视化能力,就能轻松做出你要的效果:当环形图数量超过6个时,通过下拉选项切换不同分组的环形图,每组最多显示6个。
实现步骤与代码示例
1. 准备环境与数据
先加载所需工具包,同时构造符合你需求的示例数据:
library(shiny) library(plotly) library(dplyr) # 构造示例数据(匹配你提供的结构) set.seed(123) value <- sample(1:300, 10) # 模拟10个KPI的实际值 Target <- sample(50:350, 10) # 模拟对应目标值 KPI <- paste0("Sec", 1:10) df <- data.frame(KPI, value, Target)
2. 编写交互可视化应用
核心逻辑是:自动将KPI按每6个一组拆分,通过下拉菜单切换分组,每组内的环形图会组合展示在同一个区域中:
ui <- fluidPage( titlePanel("多KPI环形图监控"), # 下拉菜单:KPI数量>6时自动生成分组选项 selectInput("group", "选择KPI分组", choices = paste0("组", 1:ceiling(nrow(df)/6))), plotlyOutput("donut_plots") ) server <- function(input, output) { # 按每6个KPI拆分分组(响应式数据) grouped_data <- reactive({ split(df, ceiling(seq_along(df$KPI)/6)) }) # 根据选中分组渲染环形图组 output$donut_plots <- renderPlotly({ selected_group <- grouped_data()[[input$group]] # 为每个KPI生成独立环形图 plot_list <- lapply(1:nrow(selected_group), function(i) { kpi_detail <- data.frame( category = c("实际值", "剩余目标"), value = c(selected_group$value[i], selected_group$Target[i] - selected_group$value[i]) ) plot_ly(kpi_detail, labels = ~category, values = ~value, type = "pie", hole = 0.6, # hole参数控制环形空心大小 textinfo = "label+percent", textposition = "inside", showlegend = FALSE) %>% layout(title = selected_group$KPI[i], margin = list(t = 30, b = 0, l = 0, r = 0)) }) # 将多个环形图组合成规整布局 subplot(plot_list, nrows = 2, margin = 0.05) %>% layout(showlegend = FALSE) }) } shinyApp(ui, server)
3. 效果与关键细节
- 分组自适应:无论KPI总数多少,都会自动按每6个一组拆分,下拉菜单同步生成对应选项
- 环形图逻辑:每个环形图展示单个KPI的实际值占目标值的比例,剩余部分为未完成的目标量
- 布局优化:多个环形图自动排列成多行,保持视觉整洁,每个环形图自带KPI名称标题
内容的提问来源于stack exchange,提问作者gh rah
相关产品推荐
相关产品推荐

