使用matplotlib面向对象接口用seaborn绘图

lf5gs5x2  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(132)

我更喜欢在OOP风格中使用matplotlib

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

这使得跟踪多个图形和子图更容易。
问:如何使用seaborn?或者,如何将this example更改为OOP风格?如何告诉seaborn绘图函数(如lmplot)它将绘制到FigureAxes

sg2wtvxw

sg2wtvxw1#

这取决于你使用的是哪一个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级别的函数只会绘制到Axes上,不会干扰图形,因此它们可以在面向对象的matplotlib脚本中完美地共存。
第二组功能(图形级别)的区别在于,结果图可能包含几个始终以“有意义”方式组织的轴。这意味着函数需要完全控制图形,因此不可能绘制,例如,一个lmplot到一个已经存在的图形上。调用该函数总是初始化一个图形,并为它正在绘制的特定绘图设置它。
但是,一旦调用了lmplot,它将返回一个类型为FacetGrid的对象。该对象具有一些方法,用于对结果图进行操作,这些方法对图的结构有一定的了解。它还在FacetGrid.figFacetGrid.axes参数处公开了基础图形和轴数组。jointplot函数非常类似,但是它使用了一个JointGrid对象。所以你仍然可以在一个面向对象的上下文中使用这些函数,但是你所有的定制都必须在你调用了这个函数之后。

相关问题