【发布时间】:2015-02-20 14:48:58
【问题描述】:
如果我在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(),但是有什么方法可以将其设为默认值吗?
【问题讨论】:
-
但这真的有意义吗?
plt.plot只使用当前活动的轴和绘图。如果您想避免第三方代码绘制到您的图形,您可以例如关闭它。使用sca取消设置您创建的轴,因为currently active轴也应该可以工作。在我看来,强制plt.plot关闭所有打开的地块的默认行为可能很难激发:) -
我完全理解您在这里的担忧,但我认为 python 代码与其他 OO 语言有点不同,例如Java/C#。在 python 中,信息隐藏是调用者和被调用者之间的约定。例如。与许多其他语言一样,没有私有成员属性,但属性以下划线开头的约定应视为
private。但这不是强制执行的。我认为你的例子是类似的情况。我会考虑无条件地打电话给plt.plot,但不以任何方式禁止。 -
很好。这并不能真正帮助我回答我的问题,你基本上是在告诉我我不应该担心它:)
-
不,我是说:我认为没有简单直接的解决方案。但当然,这可能是一个问题,这是有正当理由的。但是对于这些情况,可能有一个简单的解决方法:如果您确定
plt.gca()不会返回您的轴,那么其他函数应该不能再操纵您的绘图了。还有sca()...
标签: python matplotlib