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

如何在Python的plotnine中正确使用facet_wrap/facet_grid仅显示对应父类别的子类别?

如何在Python的plotnine中正确使用facet_wrap/facet_grid仅显示对应父类别的子类别?

看起来你遇到的问题是plotnine的分面默认会在所有子图中保留完整的y轴类别集合,导致每个父类别分面里都显示了所有子类别(包括不属于它的),这确实挺影响可视化效果的!别担心,只需要一个小参数就能轻松解决这个问题。

先回顾你的场景:你有一个包含日期、父类别和子类别的数据集,想用facet_wrap按父类别纵向分面,但希望每个分面只显示对应父类别的子类别,而不是把所有子类都列在每个分面的y轴上。

问题根源

你当前的代码中,facet_wrap("parent_category",ncol=1)没有设置刻度的自由缩放属性,plotnine会默认在所有分面中保留child_category的全部取值作为y轴刻度,哪怕某个分面里没有该子类的数据,就出现了你截图里“所有子类别重复出现在所有分面”的情况。

解决方案:添加scales="free_y"参数

只需要在facet_wrap中添加scales="free_y"参数,让每个分面的y轴刻度自动适配该分面内的实际数据,就能实现你想要的效果!

以下是修改后的完整代码:

import pandas as pd
import plotnine as p9
from plotnine import *

# 创建样本数据集
new_data = {
    'date': pd.date_range('2022-01-01', periods=8, freq="ME"),
    'parent_category': ['Electronics', 'Electronics', 'Fashion', 'Fashion', 'Home Goods', 'Electronics', 'Fashion','Electronics'],
    'child_category': ['Smartphones', 'Laptops', 'Shirts', 'Pants', 'Kitchenware','Laptops', 'Shirts', 'Smartphones']
}

# 转换为DataFrame
new_data = pd.DataFrame(new_data)

# 绘制图形,关键修改是facet_wrap添加scales="free_y"
(ggplot(new_data
        ,aes(x="date", y="child_category")) +
        geom_line(size = 8, color = "pink") +
        geom_point(size = 6, color = "grey") +
        # 新增scales="free_y"参数,让每个分面y轴仅保留当前分面存在的类别
        facet_wrap("parent_category",ncol=1, scales="free_y") +
        theme_538() +
        theme(axis_text_x=element_text(angle=45, hjust=1),
              panel_grid_major = element_blank(),
              figure_size=(8, 6)
              )
        )

效果说明

修改后:

  • Electronics分面只会显示Smartphones和Laptops两个子类别
  • Fashion分面只会显示Shirts和Pants两个子类别
  • Home Goods分面只会显示Kitchenware一个子类别

完全符合你“仅显示对应父类别子类别”的预期输出。

如果之后你需要更精细的控制(比如手动指定每个分面的y轴类别顺序),也可以先对数据集按父类别分组处理后再绘图,但scales="free_y"是最直接高效的解决方法。

备注:内容来源于stack exchange,提问作者ViSa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:13:02