基于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
相关产品推荐
相关产品推荐

