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

Shiny应用条形图颜色定制:左侧3个基准条形保留蓝色

解决方法:区分基准组与测试组并自定义填充色

要实现前3个来自benchmark的条形为蓝色系、其余来自第二个表格的条形用其他颜色的需求,我们需要先在数据中标记两类数据的归属,再针对分组设置对应配色。下面是具体的实现方案:

关键步骤说明

  1. 添加分组标记:在合并两个表格前,分别给基准组(tempBench)和测试组(tempPost)新增一个分组列,明确区分两类数据;
  2. 保留分组信息重塑数据:使用melt时保留分组列,确保后续绘图能识别数据归属;
  3. 自定义填充色映射:通过scale_fill_manual为基准组指定蓝色系配色,为测试组设置其他颜色(比如灰色系或你偏好的其他色调)。

修改后的完整代码

output$graphPost <- renderPlot({ 
  s <- input$posttestsdata_rows_selected 
  y <- input$benchmarkdata_rows_selected 
  
  # 处理基准组数据,添加分组标记
  tempBench <- benchmarkData[y] 
  colnames(tempBench)[1] <- "x" 
  tempBench$group <- "benchmark"  # 标记基准组
  
  # 处理测试组数据,添加分组标记
  tempPost <- postTestsData[s] 
  colnames(tempPost)[1] <- "x" 
  tempPost$group <- "post"  # 标记测试组
  
  # 合并两类数据
  postTestsDataForGraph <- rbind(tempBench, tempPost) 
  
  # 重塑数据并保留分组信息
  meltPostTests <- melt(postTestsDataForGraph, id.vars = c("x", "group")) 
  
  # 设置x轴因子顺序(保持原数据顺序)
  meltPostTests$x <- factor(meltPostTests$x, levels=unique(meltPostTests$x)) 
  
  # 绘制图表
  postTestsPlot <<- ggplot() + 
    geom_bar(data = meltPostTests, aes(x = as.factor(x), y = value, fill = group), 
             stat='identity', position = "dodge") + 
    # 保留原主题设置
    theme(axis.line=element_blank(), axis.text.y=element_blank(), axis.ticks=element_blank(), 
          axis.title.x=element_blank(), axis.title.y=element_blank(), panel.background=element_blank(), 
          panel.border=element_blank(), panel.grid.major=element_blank(), panel.grid.minor=element_blank(), 
          plot.background=element_blank()) + 
    # 基准组水平线颜色沿用原蓝色系
    geom_hline(yintercept = melt(tempBench[, -ncol(tempBench)])$value, 
               color = c("#1F497D", "#4F81BD", "#8DB4E3")) + 
    # 数值标签设置
    geom_text(aes(x = as.factor(x), y = value, label = paste(value,"%", sep = "")), 
              position=position_dodge(width=0.9), vjust=-0.25) + 
    # 自定义填充色:基准组用蓝色,测试组用灰色(可按需修改)
    scale_fill_manual(values = c(
      "benchmark" = "#4F81BD",
      "post" = "#CCCCCC"
    )) 
  
  return(postTestsPlot) 
})

进阶调整:基准组条形用不同蓝色

如果你希望基准组的3个条形分别使用不同的蓝色(和原代码中的水平线颜色对应),可以将填充色映射改为variable,并为每个基准变量单独指定颜色:

# 假设基准组的变量名为var1、var2、var3,测试组为var4、var5...
scale_fill_manual(values = c(
  "var1" = "#1F497D",
  "var2" = "#4F81BD",
  "var3" = "#8DB4E3",
  "var4" = "#CCCCCC",
  "var5" = "#999999"
))

内容的提问来源于stack exchange,提问作者Rémi Pts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:43:34