在使用子图和单个图时,我在matplotlib中对函数的微妙差异(它们被称为是什么?)感到非常困惑。
举个例子:
如果我想在单个数字上更改xlim,我会这样做:plt.xlim()
如果我想更改子图上的xlim,我会这样做:ax.set_xlim()
这是为什么?任何人都可以将我发送到解释惯例的网站吗? 这是一个简单的例子,因为我知道它们是不同的,以及如何,但有许多我不知道的,我很难搞清楚 - 例如:
1)将集合应用于子图:ax.collection(collection_name)
。你如何为一个人物做这件事?
2)将刻度标签应用于子图:ax.xaxis.ticklabels(tick_labels)
。你如何为一个人物做这个?
对不起,这是一个新问题!
答案 0 :(得分:8)
您正在点击pyplot /状态机界面和OO界面之间的差异。有关详细说明,请参阅Which is the recommended way to plot: matplotlib or pylab?和How can I attach a pyplot function to a figure instance?。
有关更长时间的教程,请参阅Anatomy of Matplotlib
mpl中的对象层也存在一些混淆:
Figure
整个数字。跟踪所有儿童轴,一小部分“特殊”艺术家(标题,图形图例等)和画布。不要过于担心画布,它是至关重要的,因为它是实际绘图的对象,以获得你的情节,但作为用户,它或多或少是你不可见的。
Axes
这就是你所说的“情节”,它是具有数据空间的图像区域。它有2或3个轴对象(x,y,有时是z),并且包含一大堆艺术家。
Axis
这些是像对象一样的数字行。他们负责设置图表限制并生成刻度和刻度标签。他们有一个Locator
和一个Formatter
来整理蜱的去向以及如何生成标签
Artist
基本上,您在图中看到的所有内容都是艺术家(甚至是Figure
,Axes
和Axis
个对象。这包括Text
个对象,Line2D
个对象,collection
个对象,Patch
个对象......(您明白了)。渲染图形时,所有艺术家都会(递归地)绘制到画布。给定的艺术家只能在一个Axes
。
pylab
这基本上只是一个名称空间,通过from foo import *
批量导入一大堆东西(numpy,pyplot,mlab(附带matplotlib))。这对于交互式工作来说非常方便,但是你不应该使用脚本。这个
pyplot
这是一个状态机图层,可跟踪所有打开的数字,并具有“当前数字”(plt.gcf()
)和“当前轴”(plt.gca()
)的概念。 pyplot
中的大多数函数都是围绕对OO层(plt.foo()
- > plt.gca().foo()
或plt.gcf().foo()
的调用非常精简(按程序生成)包装器,具体取决于函数)。同样,这可能方便,但很快就会变得有限/混乱/全局状态会造成麻烦。
这是实际管理艺术家创作的图层(ex ax.plot(...)
创建了一堆Line2D
个对象)。对于编写脚本或任何您打算重用的东西,这是您应该尝试使用的层。要编写自己的绘图函数,我建议编写如下函数:
def my_plotting_fun(ax, data, data, ...):
ax.do_stuff
return list_of_artists_added