You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:22:47