何时使用matplotlib.pyplot类以及何时使用plot对象(matplotlib.collections.PathCollection)

时间:2013-11-10 21:13:47

标签: python matplotlib

我想知道问题背后的逻辑是什么时候使用绘图实例(这是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

2 个答案:

答案 0 :(得分:7)

根据PEP20:

  • "明确比隐含更好。"
  • "简单比复杂更好。"

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

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

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

答案 1 :(得分:1)

'plt'只是一个快捷方式,当你只有1个情节时它很有用。当您直接自动使用plt时,matplotlib会创建一个“图”和一个子图,但是当您想要使用多个子图时,则需要使用'axes'方法,例如:

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'完成。