Plotting with seaborn using the matplotlib object-oriented interface

I strongly prefer using matplotlib in OOP style:

f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(...)
axarr[1].plot(...)

This makes it easier to keep track of multiple figures and subplots.

Question: How to use seaborn this way? Or, how to change this example to OOP style? How to tell seaborn plotting functions like lmplot which Figure or Axes it plots to?

103203 次浏览

这在一定程度上取决于您正在使用的 seborn 函数。

海运标绘功能大致可分为两类

  • “ Axes-level”函数,包括 regplotboxplotkdeplot和许多其他函数
  • “图形级”功能,包括 relplotcatplotdisplotpairplotjointplot和一两个其他功能

The first group is identified by taking an explicit ax argument and returning an Axes object. As this suggests, you can use them in an "object oriented" style by passing your Axes to them:

f, (ax1, ax2) = plt.subplots(2)
sns.regplot(x, y, ax=ax1)
sns.kdeplot(x, ax=ax2)

轴级别的函数只能绘制到 Axes上,否则不会影响图形,因此它们可以在面向对象的 matplotlib 脚本中完美地共存。

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

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