问题:使用matplotlib面向对象的界面进行seaborn绘图
我非常喜欢matplotlib
以OOP风格使用:
f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(...)
axarr[1].plot(...)
这样可以更轻松地跟踪多个图形和子图。
问题:如何以这种方式使用seaborn?或者,如何将此示例更改为OOP样式?如何分辨seaborn
绘图功能(例如lmplot
哪个Figure
或哪个)Axes
?
回答 0
这在某种程度上取决于您使用的是哪种功能。
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)
轴级功能将仅绘制到,Axes
并且不会与图形混淆,因此它们可以在面向对象的matplotlib脚本中完美地愉快地共存。
第二组功能(图级)的特征在于,生成的图可能包含多个轴,这些轴始终以“有意义”的方式组织。这意味着功能需要完全控制图形,因此不可能将图形绘制lmplot
到已经存在的图形上。调用该函数始终会初始化图形,并将其设置为要绘制的特定图。
但是,一旦调用lmplot
,它将返回类型的对象FacetGrid
。该对象具有一些对生成的图进行操作的方法,这些方法对图的结构有所了解。它还在FacetGrid.fig
和FacetGrid.axes
参数处公开了基础图形和轴数组。该jointplot
功能非常相似,但是它使用一个JointGrid
对象。因此,您仍然可以在面向对象的上下文中使用这些函数,但是所有自定义必须在调用该函数之后进行。