使用matplotlib面向对象的界面用seaborn绘图

Fro*_*ame 93 python oop matplotlib seaborn

我更喜欢使用matplotlibOOP风格:

f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(...)
axarr[1].plot(...)
Run Code Online (Sandbox Code Playgroud)

这样可以更轻松地跟踪多个图形和子图.

问题:如何使用seaborn这种方式?或者,如何将此示例更改为OOP样式?如何将seaborn绘图函数描述为lmplot哪个Figure或哪个Axes绘图?

mwa*_*kom 202

这取决于你正在使用的seaborn功能.

seaborn中的绘图功能大致分为两类

  • "轴级"功能,包括regplot,boxplot,kdeplot,和许多其他
  • "图级"功能,包括lmplot,factorplot,jointplot和一个或两个其他

通过采用显式ax参数并返回Axes对象来识别第一组.正如这表明的那样,你可以通过传递它们来以"面向对象"的方式使用Axes它们:

f, (ax1, ax2) = plt.subplots(2)
sns.regplot(x, y, ax=ax1)
sns.kdeplot(x, ax=ax2)
Run Code Online (Sandbox Code Playgroud)

轴级函数只会绘制到一个Axes并且不会弄乱图形,因此它们可以在面向对象的matplotlib脚本中完美地共存.

第二组函数(图级)的特征在于,得到的图可能包括几个始终以"有意义"方式组织的轴.这意味着函数需要完全控制图形,因此不可能绘制lmplot一个已存在的函数.调用该函数始终初始化一个图形并将其设置为它绘制的特定图形.

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