如何在facet_wrap中拆分高销量分类FOODS_1_012与其余分类?
问题解决:拆分高销量分类与其他分类的分面绘图
我有一个包含item_id分类列的数据集,其中FOODS_1_012分类的销量远高于其他分类。当前用facet_wrap按门店(store_id)绘图时,该高销量分类会压缩其他分类的趋势展示,需求是每个门店下生成两个子图:一个单独展示FOODS_1_012,另一个合并展示其余所有分类。
原代码
#facet wrap of monthly sales by item and store. grocery_tsibble %>% filter(state_id == "TX") %>% group_by(time = month, store_id, item_id) %>% summarise(sales=sum(sales)) %>% ggplot(aes(x=as.Date(month), y=sales, color = item_id)) + geom_line() + facet_wrap(~store_id) + theme_clean() + ggtitle("Line Plot") + xlab("Year - Months") + ylab("Sales") + scale_x_date(date_breaks = "5 months", labels = scales::date_format(format = "%y-%m")) + scale_y_continuous(n.breaks = 10) + theme(legend.position="bottom", legend.text = element_text(size=7), legend.title = element_text(size=7, vjust = 0.7), legend.key.size = unit(0.5, 'cm'), axis.text.x = element_text(angle = 90, hjust = 1), panel.grid.major.x = element_line(color = "gray", size = 0.5, linetype = 3), plot.margin = margin(.35,.75,.35,.35, "cm"), plot.title = element_text(color="#6b5b5a", size=14, face="bold.italic",hjust = 0.5), axis.title.x = element_text(color="#6b5b5a", size=10, face="bold"), axis.title.y = element_text(color="#6b5b5a", size=10, face="bold"), strip.background =element_rect(fill="#494d54"), strip.text = element_text(colour = 'white'))
修改后的代码
# 按门店和自定义分组拆分的月度销量分面图 grocery_tsibble %>% filter(state_id == "TX") %>% group_by(time = month, store_id, item_id) %>% summarise(sales = sum(sales), .groups = "drop") %>% # 显式释放分组避免警告 # 新增分组列:拆分高销量分类与其他分类 mutate(item_group = case_when( item_id == "FOODS_1_012" ~ "FOODS_1_012", TRUE ~ "其他分类" )) %>% ggplot(aes(x = as.Date(month), y = sales, color = item_id)) + geom_line() + # 按门店+自定义分组分面,每个门店对应两个子图 facet_wrap(~store_id + item_group, scales = "free_y") + # 自由y轴更清晰展示趋势 theme_clean() + ggtitle("各门店月度销量趋势(拆分高销量分类)") + xlab("年份-月份") + ylab("销量") + scale_x_date(date_breaks = "5 months", labels = scales::date_format(format = "%y-%m")) + scale_y_continuous(n.breaks = 10) + theme(legend.position = "bottom", legend.text = element_text(size = 7), legend.title = element_text(size = 7, vjust = 0.7), legend.key.size = unit(0.5, 'cm'), axis.text.x = element_text(angle = 90, hjust = 1), panel.grid.major.x = element_line(color = "gray", size = 0.5, linetype = 3), plot.margin = margin(.35,.75,.35,.35, "cm"), plot.title = element_text(color = "#6b5b5a", size = 14, face = "bold.italic", hjust = 0.5), axis.title.x = element_text(color = "#6b5b5a", size = 10, face = "bold"), axis.title.y = element_text(color = "#6b5b5a", size = 10, face = "bold"), strip.background = element_rect(fill = "#494d54"), strip.text = element_text(colour = 'white'))
关键修改说明
- 新增分组列:用
case_when创建item_group,将FOODS_1_012单独归为一组,其余分类合并为"其他分类" - 调整分面逻辑:分面公式改为
~store_id + item_group,确保每个门店对应两个子图 - 启用自由y轴:添加
scales = "free_y"让每个子图的y轴范围独立,彻底解决高销量分类压缩其他趋势的问题 - 释放分组:
summarise时添加.groups = "drop"避免分组残留的警告
内容的提问来源于stack exchange,提问作者n4tur3
相关产品推荐
相关产品推荐

