如何在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
相关产品推荐
相关产品推荐

