Seaborn Object Interface多变量分面图自定义子图标题方法
如何在Seaborn Object Interface的多变量分面图中自定义子图标题
我用Seaborn Object Interface绘制双变量分面图时,子图标题统一显示为kind: ,想要改成对应变量的名称(比如kind: A、face: odd这类)。尝试用带两个参数的format方法报错,目前靠判断观测值实现了需求,但想找不用判断观测值的更优方法。
原错误代码
import pandas as pd import numpy as np import seaborn.objects as so df = pd.DataFrame( np.array([['A','B','A','B'],['odd','odd','even','even'], [1,2,1,2], [2,4,1.5,3],]).T , columns= ['kind','face','Xs','Ys'] ) ( so.Plot(df,x='Xs' , y='Ys') .facet("kind","face") .add(so.Dot()) .label(title= 'kind :{}'.format) )
临时解决方案(依赖观测值判断)
import pandas as pd import numpy as np import seaborn.objects as so df = pd.DataFrame( np.array([['A','B','A','B'],['odd','odd','even','even'], [1,2,1,2], [2,4,1.5,3],]).T , columns= ['kind','face','Xs','Ys'] ) def multiObs_facet_title(t:tuple) -> str: if t in ['A','B']: return 'kind: {}'.format(t) else: return 'face: {}'.format(t) ( so.Plot(df,x='Xs' , y='Ys') .facet("kind","face") .add(so.Dot()) .label(title= multiObs_facet_title) )
最优解决方案(无需判断观测值)
Seaborn Object Interface在多变量分面时,会把每个子图的变量名和对应取值以元组形式传给标题格式化函数。直接拆分这个元组就能生成通用的标题,不用依赖观测值判断:
import pandas as pd import numpy as np import seaborn.objects as so df = pd.DataFrame( np.array([['A','B','A','B'],['odd','odd','even','even'], [1,2,1,2], [2,4,1.5,3],]).T , columns= ['kind','face','Xs','Ys'] ) def facet_title_formatter(facet_tuple): var_name, value = facet_tuple return f'{var_name}: {value}' ( so.Plot(df, x='Xs', y='Ys') .facet("kind", "face") .add(so.Dot()) .label(title=facet_title_formatter) )
说明
- 多变量分面时,
label(title=...)接收的函数会被传入(变量名, 取值)格式的元组 - 拆分元组后直接拼接,不管变量或取值怎么变更,代码都能适配,完全通用
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

