Shiny App勾选多变量查看对应直方图的代码问题求解
多变量直方图输出实现方案
原代码仅支持单变量绘图的核心原因是:多选变量时input$selected_var返回多元素字符向量,ggplot单次调用无法同时映射多个x轴变量。可通过批量生成绘图对象+多图拼接的方式实现需求,修改后的完整可运行代码如下:
library(shiny) library(ggplot2) library(gridExtra) ui <- fluidPage( titlePanel("多变量直方图查看工具"), sidebarLayout(position = "left", sidebarPanel("侧边栏", checkboxGroupInput(inputId = "selected_var", label = "选择变量:", choices = names(mtcars)) ), mainPanel("主面板", column(12, plotOutput(outputId = "plotgraph", width = "100%", height = "auto")) ) ) ) server <- function(input, output){ output$plotgraph <- renderPlot({ # 未选中变量时不执行绘图,避免报错 req(input$selected_var) # 遍历选中的变量,批量生成直方图+密度曲线对象 plot_list <- lapply(input$selected_var, function(var) { ggplot(data = mtcars, aes(x = .data[[var]])) + geom_histogram(aes(y = ..density..), bins = 15, col = "darkgreen", fill = "darkgreen", alpha = 0.7) + geom_density(col = "red", alpha = .2, fill = "#FF6666") + labs(x = var) # 用变量名作为x轴标签,便于区分 }) # 拼接所有生成的图,最多2列,行数根据变量数量自动适配 grid.arrange(grobs = plot_list, ncol = min(2, length(plot_list))) }, height = function() { # 动态调整绘图高度,每2个变量增加400px高度 ceiling(length(input$selected_var)/2)*400 }) } shinyApp(ui = ui, server = server)
调整说明
- 原代码bins参数设为100过大,mtcars只有32行样本,已调整为15,可根据实际数据集情况修改
- 绘图高度设置为动态适配,选中变量越多绘图区域自动越高,避免图被压缩
- 用
.data[[var]]替代软弃用的aes_string,兼容性更好 - 绘图宽度调整为100%适配主面板宽度,也可根据需求改回固定像素值
内容的提问来源于stack exchange,提问作者symkly
相关产品推荐
相关产品推荐

