Python 使用matplotlib面向对象接口使用seaborn打印

Python 使用matplotlib面向对象接口使用seaborn打印,python,oop,matplotlib,seaborn,Python,Oop,Matplotlib,Seaborn,我非常喜欢使用OOP风格的matplotlib: f, axarr = plt.subplots(2, sharex=True) axarr[0].plot(...) axarr[1].plot(...) 这使得跟踪多个图形和子图变得更容易 问题:如何以这种方式使用seaborn?或者,如何更改为OOP风格?如何分辨seaborn打印函数,如lmplot它打印到哪个Figure或Axes?这取决于您使用的seaborn函数 seaborn中的绘图函数大致分为两类 “轴级”功能,包括regpl

我非常喜欢使用OOP风格的
matplotlib

f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(...)
axarr[1].plot(...)
这使得跟踪多个图形和子图变得更容易


问题:如何以这种方式使用seaborn?或者,如何更改为OOP风格?如何分辨
seaborn
打印函数,如
lmplot
它打印到哪个
Figure
Axes

这取决于您使用的seaborn函数

seaborn中的绘图函数大致分为两类

  • “轴级”功能,包括
    regplot
    boxplot
    kdeplot
    ,以及许多其他功能
  • “图形级”功能,包括
    relplot
    catplot
    displat
    pairplot
    jointplot
    和一个或两个其他功能
第一组通过获取显式的
ax
参数并返回
Axes
对象来识别。这表明,您可以通过将
传递给它们,以“面向对象”的方式使用它们:

f, (ax1, ax2) = plt.subplots(2)
sns.regplot(x, y, ax=ax1)
sns.kdeplot(x, ax=ax2)
轴级函数只会绘制到
轴上,不会弄乱图形,因此它们可以在面向对象的matplotlib脚本中完美共存

第二组功能(图形级)的区别在于,生成的图可能包含多个轴,这些轴始终以“有意义”的方式组织。这意味着函数需要完全控制图形,因此不可能将
lmplot
绘制到已经存在的图形上。调用函数总是初始化图形,并为其绘制的特定绘图进行设置


但是,一旦调用了
lmplot
,它将返回该类型的对象。这个对象有一些对结果图进行操作的方法,这些方法对图的结构有一点了解。它还公开了
FacetGrid.fig
FacetGrid.axes
参数处的底层图形和轴数组。
jointplot
函数非常类似,但它使用了一个对象。因此,您仍然可以在面向对象的上下文中使用这些函数,但所有的自定义都必须在调用函数之后进行。

这非常有用。看看我的答案:相关:以及一个可能的解决方法,这将允许创建一个seaborn图形,并在以后将所有轴移动到子地块栅格。