【问题标题】:Plotting with seaborn using the matplotlib object-oriented interface使用 matplotlib 面向对象的接口使用 seaborn 进行绘图
【发布时间】:2020-01-14 19:11:27
【问题描述】:

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

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

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

问题:如何以这种方式使用seaborn?或者,如何将this example 更改为 OOP 样式?如何判断 seaborn 绘图函数,如 lmplot 哪个 FigureAxes 它绘图?

【问题讨论】:

  • 相关:This issuethis answer 寻求一种可能的解决方法,这将允许创建一个海底图形并将所有轴移动到一个子图网格。

标签: python oop matplotlib seaborn


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2021-01-21
  • 2021-03-14
  • 1970-01-01
  • 2021-05-12
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多