R ggplot绘制折线图出现异常竖线问题排查
解决ggplot折线图出现异常竖线的问题
问题原因分析
- 字段名不匹配:主数据集用
Day字段做分面,但coldcounter用的是Day of Week,导致分面时coldcounter的所有日期数据被强行渲染到每个分面中。 - 分组逻辑错误:
geom_line里的group=1会把所有分面的时段点跨日期连接,不同日期的同时段点被连起来就出现了竖线。 - 数值范围不匹配:员工数(
emp)的数值远小于销售百分比(percent),折线会被压缩到图表底部,视觉效果极差。
分步解决方案
1. 统一数据集的日期字段名
修改coldcounter的汇总代码,把Day of Week重命名为Day,和主数据集字段名保持一致:
coldcounter <- schedules %>% group_by(`Day of Week`, Time) %>% summarize(emp = sum(`# of Employees`)/4) %>% rename(Day = `Day of Week`) # 重命名字段,匹配主数据集
2. 修正折线图的分组逻辑
在geom_line中按Day分组,确保每个分面只连接当天的时段数据,同时禁用继承主图层的美学映射,避免冲突:
geom_line(data=coldcounter, aes(x=Time, y=emp, group=Day), inherit.aes = FALSE)
3. 添加双y轴优化视觉效果(可选但推荐)
因为员工数和销售百分比的数值范围差异极大,添加第二个y轴适配员工数的刻度,让折线清晰展示:
kitchen %>% group_by(Day, Time) %>% summarise(Sales = sum(Sales)) %>% mutate(percent = Sales/sum(Sales)*100) %>% ggplot()+ geom_bar(aes(x=Time,y=percent,fill=ifelse(percent<1,"Red","Blue")),stat="identity")+ theme(axis.text.x = element_text(angle =90))+ facet_wrap(~Day)+ ggtitle("Cold Counter Sales Overview - 11PM Close")+ ylab("% of Daily Sales")+ theme(strip.background = element_rect(fill = "lightblue"))+ scale_fill_manual(values = c("darkslategray3","red"))+ labs(fill="Less than or \nGreater than 1%")+ # 修正后的折线图层 geom_line(data=coldcounter, aes(x=Time, y=emp*20, group=Day), color="black", inherit.aes = FALSE)+ # 配置第二个y轴,对应员工数的实际值 scale_y_continuous( sec.axis = sec_axis(~./20, name = "Average # of Employees") )+ scale_x_discrete(limits = c("6:30 AM","7:00 AM","11:00 PM")) # 补全你的完整时段列表
注:emp*20是缩放因子,可根据你的实际员工数范围调整,确保折线在图表中显示位置合理。
修改后效果说明
- 统一字段名后,分面逻辑会正确匹配每个日期的员工数数据,每个分面只显示当天的时段点。
- 按
Day分组后,折线仅连接同一日期内的时段点,不会跨日期产生异常竖线。 - 双y轴解决了数值范围差异导致的折线不可见问题,让销售占比和员工数两个指标都清晰展示。
内容的提问来源于stack exchange,提问作者Anthony Jacob
相关产品推荐
相关产品推荐

