Shiny应用条形图颜色定制:左侧3个基准条形保留蓝色
解决方法:区分基准组与测试组并自定义填充色
要实现前3个来自benchmark的条形为蓝色系、其余来自第二个表格的条形用其他颜色的需求,我们需要先在数据中标记两类数据的归属,再针对分组设置对应配色。下面是具体的实现方案:
关键步骤说明
- 添加分组标记:在合并两个表格前,分别给基准组(
tempBench)和测试组(tempPost)新增一个分组列,明确区分两类数据; - 保留分组信息重塑数据:使用
melt时保留分组列,确保后续绘图能识别数据归属; - 自定义填充色映射:通过
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
相关产品推荐
相关产品推荐

