绘制多列countplot时如何避免fig.axes存储为numpy.ndarray
问题解答
你当前的绘图代码本身没有问题,生成数值准确的前提下不需要调整核心绘图逻辑。sns.catplot()传入col参数时返回的是FacetGrid对象,其axes属性默认以二维numpy数组格式存储,哪怕你只生成1行2列共2个子图也会保持二维结构——这是seaborn的固定设计,目的是统一多行多列子图场景下的索引逻辑,不是代码bug。
你遇到的测试模块不支持ndarray输入的问题,只需要加极少量代码做格式适配即可解决,以下是几种可行方案:
适配方案
- 数组展平法:绘图完成后加一行代码将二维轴数组展平为一维,后续按原有
[0]、[1]的一维索引方式使用即可:# 展平后axes[0]、axes[1]分别对应两个子图 axes = fig.axes.flatten() - 属性覆写法:如果测试模块是直接读取
fig.axes属性做判断,可以直接把该属性覆写为一维列表,完全不影响已生成的绘图效果:fig.axes = list(fig.axes.flat) - 直接索引法:如果只需要引用单个子图,直接用二维索引取值即可,
fig.axes[0,0]和fig.axes[0][0]效果完全一致,都能取到cardio=0对应的第一个子图。
注:该二维存储设计本身不会影响绘图结果的正确性,只是seaborn为了兼容同时生成多行、多列子图的场景做的统一结构设计,日常使用时如果没有类型兼容要求,直接用二维索引访问轴对象即可。
内容的提问来源于stack exchange,提问作者Abdul
相关产品推荐
相关产品推荐

