使用geom_bar()高亮倍数条形图时出现条形尺寸异常问题求助
解决ggplot2高亮特定条形时尺寸异常的问题
嘿,这个问题我之前也踩过坑!问题根源在于你连续调用了两次geom_bar():第一次调用已经帮你统计了每个x值的频数并绘制了正常的条形,第二次再调用geom_bar()时,它会重新对原始数据集做一次频数统计,相当于把相同的条形叠在了一起,再加上fill映射是基于每条原始数据的判断,最终就导致了条形尺寸异常的情况。
下面给你两种简单的解决办法:
方法一:在单个geom_bar()中完成颜色映射
直接把填充颜色的判断逻辑放到第一次geom_bar()的aes里,只调用一次geom_bar()就好,这样只会做一次频数统计:
library(ggplot2) # 给数据框的列命名,避免后续引用混乱 smpl <- data.frame(x = sample(1:31, 1000, replace = T)) # 在同一个geom_bar里设置fill映射 p <- ggplot(data = smpl, aes(x = x, fill = (x %% 5 == 0))) + geom_bar() p
方法二:先预处理数据,再绘图
如果你习惯更清晰的数据流程,可以先统计好每个x值的频数,再用geom_col()(适合已有频数数据的场景)绘图:
library(ggplot2) library(dplyr) smpl <- data.frame(x = sample(1:31, 1000, replace = T)) # 统计每个x的频数,并生成是否为5的倍数的标记列 smpl_summary <- smpl %>% count(x) %>% mutate(is_multiple_of_5 = (x %% 5 == 0)) # 用geom_col绘制,直接指定y为统计好的频数n ggplot(smpl_summary, aes(x = x, y = n, fill = is_multiple_of_5)) + geom_col()
针对你提到的“传入向量判断”的场景,比如判断x是否在c(5,10,15...)里,只需要把填充逻辑换成x %in% c(5,10,15,20,25,30)就可以了,同样放在单个geom_bar()的映射中:
p <- ggplot(data = smpl, aes(x = x, fill = (x %in% c(5,10,15,20,25,30)))) + geom_bar() p
内容的提问来源于stack exchange,提问作者Kyle Chesney
相关产品推荐
相关产品推荐

