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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:24:06