如何在plotnine中通过特征交互实现分组?
Plotnine中实现ggplot的
interaction分组功能 问题背景
在R的ggplot2中,可以通过group=interaction(store, promo)直接在绘图的美学映射里,基于两个离散因子的唯一组合创建分组,实现折线图的分组连线。但在plotnine中直接使用该语法会报错,目前只能通过手动在数据框中创建分组列实现,这种方式需要修改原数据,不够高效。
解决方案
无需修改原数据框,直接在plotnine的美学映射内完成多因子分组,有两种简洁方式:
方案1:使用元组作为分组依据
plotnine支持将多个变量组合成元组作为分组标识,直接在group参数中指定即可:
import plotnine as p9 import pandas as pd df = pd.DataFrame({ 'week': [1,2,3,4]*4, 'store': (["A"]*8 + ["B"]*8), 'promo': (["promo1"]*4 + ["promo2"]*4)*2, 'sales': [1, 2, 6, 7, 2, 3, 5, 6, 3, 4, 7, 8, 3, 5, 8, 9] }) ( p9.ggplot(df, p9.aes( x="week", y="sales", color="store", shape="promo", group="(store, promo)" )) + p9.geom_point(size=3) + p9.geom_line() )
方案2:字符串拼接生成分组因子
通过将两个离散变量拼接成唯一字符串并转为因子,也能实现相同的分组效果:
( p9.ggplot(df, p9.aes( x="week", y="sales", color="store", shape="promo", group="factor(store + '_' + promo)" )) + p9.geom_point(size=3) + p9.geom_line() )
说明
- 两种方法都不需要修改原数据框,直接在绘图逻辑内完成分组,和R中
interaction的功能完全一致。 - 元组方式更简洁,字符串拼接方式生成的分组标识可读性更强,适合需要调试分组逻辑的场景。
内容的提问来源于stack exchange,提问作者Damien Martin
相关产品推荐
相关产品推荐

