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

基于多选择定性变量的R Shiny条形图实现求助

解决方案代码与分步说明

首先先构造和你描述一致的示例数据集:

# 构造示例数据集
transport <- data.frame(
  midwest = c(10, 15, 8),
  northeast = c(12, 9, 14),
  europe = c(7, 20, 11),
  row.names = c("cars", "busses", "trains")
)
# 把行名转成单独列,方便后续绘图处理
transport$vehicle <- rownames(transport)

以下是完整的Shiny App代码,直接运行即可实现需求:

library(shiny)
library(ggplot2)
library(tidyr) # 用于数据格式转换

ui <- fluidPage(
  titlePanel("交通数据可视化"),
  # 支持多选的输入控件,默认全选所有区域
  selectizeInput(
    inputId = "selected_regions",
    label = "选择要展示的区域",
    choices = colnames(transport)[1:3], # 提取区域列名作为选项
    selected = colnames(transport)[1:3],
    multiple = TRUE # 开启多选功能
  ),
  # 条形图输出容器
  plotOutput(outputId = "transport_plot")
)

server <- function(input, output) {
  # 响应式数据处理:根据选中区域筛选并转换数据格式
  filtered_data <- reactive({
    # 保留选中的区域列和交通工具列
    selected_cols <- c(input$selected_regions, "vehicle")
    data <- transport[, selected_cols]
    # 把宽格式数据转成长格式,适配分组条形图需求
    pivot_longer(
      data,
      cols = -vehicle, # 除了交通工具列,其余列转为键值对
      names_to = "region",
      values_to = "value"
    )
  })

  # 生成分组条形图
  output$transport_plot <- renderPlot({
    ggplot(filtered_data(), aes(x = value, y = vehicle, fill = region)) +
      geom_bar(stat = "identity", position = "dodge") + # 让分组条形并排显示
      labs(
        x = "数值",
        y = "交通工具类型",
        fill = "区域"
      ) +
      theme_minimal()
  })
}

shinyApp(ui = ui, server = server)

关键逻辑说明

  • 数据格式转换:原数据集是宽格式(每列对应一个区域),而分组条形图需要长格式(每行对应一组「区域-交通工具-数值」数据),pivot_longer是实现这种转换的核心工具,也是处理多选场景的前提。
  • 响应式机制:filtered_data是响应式对象,会在你选择不同区域时自动重新计算,实时输出符合筛选条件的数据集,这就是Shiny reactivity的核心作用——让界面和数据联动。
  • 分组条形配置:用fill = region指定分组依据,position = "dodge"确保同一交通工具的不同区域条形并排展示,直接将y轴设为vehicle,刚好满足你Y轴为交通工具的需求。
  • 多选控件设置:selectizeInput的multiple = TRUE开启多选,selected参数设置默认全选,你也可以留空让用户自行选择初始项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:22:19