求助:制作按指定数据框值填充、其余为灰/黑的ggplot柱状图
解决方案
要实现你需要的柱状图(堆叠显示过滤后数值的彩色部分,剩余部分用灰色/黑色填充),可以按照以下步骤操作:
步骤1:合并并整理数据
首先将两个数据框合并,计算每个组蛋白标记的「剩余频数」(总频数 - 过滤后频数),并转换为ggplot适用的长格式:
library(dplyr) library(tidyr) library(ggplot2) # 合并数据并计算剩余频数 combined_data <- table %>% rename(total_freq = Freq) %>% inner_join(table_filt %>% rename(filtered_freq = Freq), by = "Var1") %>% mutate(remaining_freq = total_freq - filtered_freq) %>% # 转换为长格式 pivot_longer( cols = c(filtered_freq, remaining_freq), names_to = "freq_type", values_to = "freq" )
步骤2:定义颜色映射
为过滤后的部分分配你指定的颜色,剩余部分统一设置为灰色(或黑色,将#999999替换为#000000即可):
# 创建颜色映射规则:过滤部分用指定颜色,剩余部分用灰色 color_rules <- c( # 为每个组蛋白标记的过滤部分绑定对应颜色 setNames(colours, paste(names(colours), "filtered_freq", sep = "_")), # 所有剩余部分统一灰色 setNames(rep("#999999", length(colours)), paste(names(colours), "remaining_freq", sep = "_")) )
步骤3:绘制堆叠柱状图
使用堆叠柱状图展示两部分数据,并应用颜色规则:
ggplot(combined_data, aes(x = Var1, y = freq, fill = interaction(Var1, freq_type))) + geom_col(position = "stack") + # 应用颜色映射,隐藏图例(不需要区分频数类型) scale_fill_manual(values = color_rules, guide = "none") + labs(x = "组蛋白修饰标记", y = "频数") + theme_bw()
替代简化方案(直接绑定颜色列)
如果觉得颜色映射太繁琐,可以在数据框中直接生成颜色列,再用scale_fill_identity()直接应用:
combined_data_simple <- table %>% rename(total_freq = Freq) %>% inner_join(table_filt %>% rename(filtered_freq = Freq), by = "Var1") %>% mutate(remaining_freq = total_freq - filtered_freq) %>% pivot_longer( cols = c(filtered_freq, remaining_freq), names_to = "freq_type", values_to = "freq" ) %>% # 直接为每行分配颜色 mutate(fill_color = ifelse( freq_type == "filtered_freq", colours[match(Var1, names(colours))], "#999999" # 剩余部分颜色,可改为黑色#000000 )) ggplot(combined_data_simple, aes(x = Var1, y = freq, fill = fill_color)) + geom_col(position = "stack") + scale_fill_identity() + # 直接使用数据中的颜色值 labs(x = "组蛋白修饰标记", y = "频数") + theme_bw()
效果说明
最终生成的柱状图会和你参考的样式一致:每个柱子的彩色部分对应table_filt的数值,其余空白部分用灰色/黑色填充,同时保留你指定的组蛋白标记颜色规则。
内容的提问来源于stack exchange,提问作者jonny jeep
相关产品推荐
相关产品推荐

