所以我已经使用matplot一段时间了,有一件事让我感到困惑,它如何处理子图。
可以这样做:
fig = plt.figure()
ax = fig.add_subplot(1,2,1)
或者。可以这样做:
plt.subplots(1,2)
或者,可以改为:
plt.subplot(211)
或者,当然,如果我们只需要一个图,就可以立即运行
plt.plot(x,y) # or .scatter or whatever.
为什么?是否有任何实际原因使您应该在其他方面使用?
答案 0 :(得分:3)
Matplotlib是一个Python库,受MatLab的影响很大,并且部分针对以前和当前的MatLab用户,因此具有两种语法:
MatLab语法plt.sublot(211); plt.plot(); plt.colorbar();
,表示每次创建图形或子图时,它都作为最后一个活动对象存储在内部,并且对其进行所有绘图和更改参数。这是为了使那些从MatLab过渡过来的人使用起来很舒服。想法是创建一个元素并立即对其应用所有操作,然后创建下一个元素,直到调用plt.show
为止,再也不返回上一个元素。
具有显式对象声明和对该对象的操作的经典编程语法。它使其他所有人感到很舒服,并允许其返回到先前创建的对象(图和轴)并进行其他更改。
使用matlab方式很难处理多个图形。 (图是一幅独立的图片,轴是您在其中绘制数据的图片的区域)plt.show始终显示您创建的最后一个图形,例如:
plt.figure() #new figure created and stored as current active
Plt.subplot() #new axes created in current figure and stored as current axes
Plt.plot() #data plotted in current axes
Plt.subplot() #second axes added to figure and made current active
Plt.plot() #plot in current active that is second now
Plt.figure() #the new figure created, old can still be found with difficulty i believe,
#but current active is now different and plt.show will not show anything you plotted before.
但是有些人发现它更适合快速而肮脏的绘图。
您可以使用fig_1 = plt.gcf();
,ax_1 = plt.gca();
在两个之间切换,它们分别是当前图形和预期坐标。还有多种更改外观的方法,一种用于matlab
plt.make_current_axes_without_ticks( param)
和一种用于oop语言(
fig=plt.figure;
ax=fig.add_axes();
axis=ax.y_axis();
yticks=axis.ticks();
yticks.set_visible(false);
或类似的东西。
多个接口无疑使学习变得更加困难,但是它使从其他类似工具的过渡变得更容易,并且使其刚性也降低了,这意味着有时可以使用非常简单的方法来进行频繁但复杂的更改。 (请参见壁虱示例)