【问题标题】:When to use the matplotlib.pyplot class and when to use the plot object (matplotlib.collections.PathCollection)何时使用 matplotlib.pyplot 类以及何时使用绘图对象 (matplotlib.collections.PathCollection)
【发布时间】:2013-11-22 14:24:04
【问题描述】:

我想知道何时使用绘图实例(即PathCollection)以及何时使用绘图类本身的问题背后的逻辑是什么。

import matplotlib.pyplot as plt
p = plt.scatter([1,2,3],[1,2,3])

显示散点图。为了让它发挥作用,我不得不说:

plt.annotate(...)

要配置轴标签或限制,您可以编写:

plt.xlim(...)
plt.xlabel(...)

等等。

但另一方面,你写:

p.axes.set_aspect(...)
p.axes.yaxis.set_major_locator(...)

这背后的逻辑是什么?我可以在某个地方查一下吗?不幸的是,我没有在文档中找到这个特定问题的答案。

您什么时候使用实际实例p 来配置您的图形,什么时候使用pyplot 类plt

【问题讨论】:

  • @tcaswell:这些链接解释了这两种方式存在的原因,但它们并没有真正解释在 pyplot 中公开了哪些 OO 方法而哪些没有公开的背后的逻辑。
  • @BrenBarn 这些设计选择早于我,所以我不确定逻辑。但越想越觉得状态机接口是轻度有害的。它非常适合交互式工作,但会产生很大的混乱。

标签: python matplotlib


【解决方案1】:

根据 PEP20:

  • “显式优于隐式。”
  • “简单胜于复杂。”

通常,“make-it-just-work”代码采用 pyplot 路线,因为它隐藏了许多人不关心的所有图形和轴管理。这通常用于交互模式编码、简单的一次性脚本或在高级脚本中执行的绘图。

但是,如果您正在创建一个用于绘图的库模块,并且您不能保证库用户不会自己进行任何额外的绘图,那么最好是明确的并避免使用 pyplot 接口.我通常将我的函数设计为接受用户想要操作的轴和/或图形对象作为可选参数(如果没有给出,那么我使用 plt.gcf() 和/或 plt.gca())。

我的经验法则是,如果我正在执行的操作可以通过 pyplot 完成,但如果这样做可能会改变“状态机”,那么我会避免使用 pyplot。请注意,通过 pyplot 进行的任何操作(例如 plt.xlim())都会获取/设置当前坐标轴/图形/图像(“状态机”),而像 ax.set_xlim() 这样的操作则不会。

【讨论】:

    【解决方案2】:

    'plt' 只是一个快捷方式,当您只有 1 个绘图时它很有用。当您直接使用 plt 时,matplotlib 会自动创建一个“图形”和一个子图,但是当您想要使用超过 1 个子图时,您将需要使用“轴”方法,例如:

    fig = plt.figure()
    a = fig.add_subplot(211)
    b = fig.add_subplot(212)
    print a.__class__ #<class 'matplotlib.axes.AxesSubplot'>
    print fig.__class__ #<class 'matplotlib.figure.Figure'>
    a.plot([0,1],[0,1],'r')
    b.plot([1,0],[0,1],'b')
    fig.show()
    

    这不能直接使用“plt”来完成。

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2011-08-25
      • 2012-03-26
      • 2014-06-16
      • 1970-01-01
      • 2011-02-22
      • 2011-09-06
      • 2011-06-25
      • 2011-04-02
      相关资源
      最近更新 更多