我非常喜欢在 OOP 风格中使用 matplotlib
:
f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(...)
axarr[1].plot(...)
这样可以更轻松地跟踪多个图形和子图。
问题:如何以这种方式使用seaborn?或者,如何更改this example以 OOP 风格?如何告诉 seaborn
绘图函数,如 lmplot
它绘制到哪个 Figure
或 Axes
?
最佳答案
这有点取决于您使用的是哪个 seaborn 函数。
seaborn中的绘图函数大致分为两类
- “轴级”函数,包括
regplot
、boxplot
、kdeplot
等等 - “图形级”函数,包括
relplot
、catplot
、displot
、pairplot
、联合图
和其他一两个
第一组通过采用显式 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
目的。因此,您仍然可以在面向对象的上下文中使用这些函数,但您的所有自定义都必须在您调用该函数之后进行。
关于python - 使用 matplotlib 面向对象的接口(interface)使用 seaborn 进行绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23969619/