121

我非常喜欢matplotlib在 OOP 风格中使用:

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

这使得跟踪多个图形和子图变得更加容易。

问题:如何以这种方式使用seaborn?或者,如何将此示例更改为 OOP 样式?如何判断seaborn绘图功能,如lmplot哪个FigureAxes它绘图?

4

1 回答 1

266

这在一定程度上取决于您使用的是哪个 seaborn 功能。

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

  • “轴级”函数,包括regplotboxplotkdeplot和许多其他函数
  • “图形级”函数,包括relplotcatplotdisplotpairplotjointplot其他一两个

第一组通过采用显式ax参数并返回一个Axes对象来标识。正如这表明的那样,您可以通过将它们传递Axes给它们来以“面向对象”的方式使用它们:

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对象。因此,您仍然可以在面向对象的上下文中使用这些函数,但是您的所有自定义都必须在您调用该函数之后进行。

于 2014-05-31T18:22:14.647 回答