如果我在matplotlib
中创建了一个Axes
对象并对其进行了变异(例如,通过绘制一些数据),然后我调用了一个函数,而没有将我的Axes
对象传递给该函数,那么该函数仍然可以对我的Axes
进行变异。例如:
import matplotlib.pyplot as plt
import numpy as np
def innocent_looking_function():
#let's draw a red line on some unsuspecting Axes!
plt.plot(100*np.random.rand(20), color='r')
fig, ax = plt.subplots()
ax.plot(100*np.random.rand(20), color='b') #draw blue line on ax
#ax now has a blue line, as expected
innocent_looking_function()
#ax now unexpectedly has a blue line and a red line!
我的问题是:我能阻止这种全球变量行为吗?我知道我可以在调用任何innocent_looking_function()
之前调用plt.close()
,但是有没有什么方法可以使其成为默认值?在
当然!您需要做的是在您生成图形时完全绕过
pyplot
状态机。在它更冗长,因为您不能只调用
fig = plt.figure()
。在首先,让我解释一下}是如何工作的。使用
plt.gca()
或{pyplot
接口时,matplotlib存储所有已创建但未显示的地物管理器。图管理器基本上是图形的gui包装器。在plt._pylab_helpers.Gcf
是存储图形管理器并跟踪当前处于活动状态的图形管理器的单例对象。plt.gcf()
返回_pylab_helpers.Gcf
中的活动图形。每个Figure
对象都跟踪自己的轴,因此plt.gca()
只是plt.gcf().gca()
。在通常,当您调用
plt.figure()
时,它:FigureManager
FigureCanvas
、gui窗口(根据需要)和NavigationToolbar2
(缩放按钮等)_pylab_helpers.Gcf
的图列表中。在这是我们想绕过的最后一步。在
下面是一个使用非交互式后端的快速示例。注意,因为我们不担心与绘图交互,所以我们可以跳过整个图形管理器,只创建一个}实例。(从技术上讲,我们可以跳过
Figure
和{FigureCanvas
,但只要我们想将绘图保存到图像中,就需要它,等等)只是为了证明
^{pr2}$gca
看不到这个轴:有了交互性的支持,就更复杂了。您不能调用
plt.show()
,所以您需要自己启动gui的主循环。您可以“从头开始”(请参阅“嵌入matplotlib”示例中的任何一个),但是FigureManager
抽象了备份的特定部分:例如,使用TkAgg后端:
要使用其他后端之一,只需更改后端导入。例如,对于Qt4:
这甚至可以与IPython笔记本中使用的
nbagg
后端配合使用。只需将后端导入更改为import matplotlib.backends.backend_nbagg as backend
相关问题 更多 >
编程相关推荐