python - 使用 matplotlib 面向对象的接口(interface)使用 seaborn 进行绘图

标签 python oop matplotlib seaborn

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

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

这样可以更轻松地跟踪多个图形和子图。

问题:如何以这种方式使用seaborn?或者,如何更改this example以 OOP 风格?如何告诉 seaborn 绘图函数,如 lmplot 它绘制到哪个 FigureAxes

最佳答案

这有点取决于您使用的是哪个 seaborn 函数。

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

  • “轴级”函数,包括 regplotboxplotkdeplot 等等
  • “图形级”函数,包括relplotcatplotdisplotpairplot联合图和其他一两个

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

关于python - 使用 matplotlib 面向对象的接口(interface)使用 seaborn 进行绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23969619/

相关文章:

python - 用数字和字符串数据绘制直方图?

python - 树莓派 python gspread OAuth 2 错误

javascript - JavaScript 中的原型(prototype)继承是否表现出类型多态性?

python - 绘制垂直于坐标的箭头

python - 初学Matplotlib,如何为图表制作随机数据

javascript - 使用数字作为 javascript 对象元素的名称

python - PyQt - 如何在 QLabel 中禁用科学记数法

python - 这个随机唯一 ID 生成器发生冲突的机会有多大?

python - 我需要 MSVCR90.dll 版本 9.0.21022.8

python - @staticmethod 和@classmethod 如何作用于python 中的变量?