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

基于Shiny实现支持自定义变量的ggplot凸包可视化功能求助

修复后的可运行Shiny凸包可视化实现

原代码核心问题

  • 两个选择输入控件ID重复,均命名为Columns,导致输入值冲突无法正常读取
  • mtcars数据集原生无factor类型列,分类变量选择框无可选选项
  • 未实现多数值变量求和作为X轴的逻辑,绘图美学映射写死,未绑定用户输入
  • 缺失凸包stat_chull的相关绘制逻辑

完整可运行代码

library(shiny)
library(dplyr)
library(ggplot2)
library(ggpubr)

# 预处理mtcars,将分类字段转换为factor类型
df <- mtcars %>%
  mutate(
    cyl = as.factor(cyl),
    vs = as.factor(vs),
    am = as.factor(am),
    gear = as.factor(gear),
    carb = as.factor(carb)
  )
numeric_cols <- df %>% select(where(is.numeric)) %>% names()
categorical_cols <- df %>% select(where(is.factor)) %>% names()

ui <- fluidPage(
  titlePanel("自定义凸包可视化工具"),
  selectInput("x_vars", "选择X轴数值变量(可多选,自动求和)",
              numeric_cols, multiple = TRUE),
  selectInput("y_var", "选择Y轴数值变量(单选)",
              numeric_cols, multiple = FALSE),
  selectInput("group_var", "选择分组变量(可选,不选则生成全局凸包)",
              c("不分组", categorical_cols), multiple = FALSE),
  plotOutput("myplot")
)

server <- function(input, output) {
  # 预处理绘图数据
  plot_data <- reactive({
    # 校验必须输入项,避免未选变量时报错
    req(input$x_vars, input$y_var)
    # 计算多X变量逐行求和结果
    df %>%
      rowwise() %>%
      mutate(x_total = sum(c_across(all_of(input$x_vars)))) %>%
      ungroup()
  })
  
  output$myplot <- renderPlot({
    req(plot_data())
    p <- ggplot(plot_data(), aes(x = x_total, y = .data[[input$y_var]])) 
    
    # 按是否分组处理散点和凸包逻辑
    if (input$group_var != "不分组") {
      group_sym <- sym(input$group_var)
      p <- p +
        geom_point(aes(color = !!group_sym, shape = !!group_sym), size = 2) +
        stat_chull(aes(color = !!group_sym, fill = !!group_sym), 
                   alpha = 0.1, geom = "polygon") +
        labs(color = input$group_var, shape = input$group_var, fill = input$group_var)
    } else {
      p <- p +
        geom_point(size = 2) +
        stat_chull(alpha = 0.1, geom = "polygon", fill = "blue", color = "black")
    }
    
    p + theme_bw()
  })
}

shinyApp(ui, server)

功能说明

  • 支持选择任意多个数值变量作为X轴,自动计算选中变量的逐行和作为X轴取值
  • 支持选择单个数值变量作为Y轴
  • 支持选择分类变量生成分组凸包,不选择分组则生成全局统一凸包
  • 自动适配分组的颜色、形状映射,凸包透明度默认设为0.1避免遮挡散点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:06:00