matplotlib NaN's vs pylab NaN's

时间:2014-02-28 18:41:36

标签: python matplotlib interpolation nan

我有两个类似的matplotlib代码,可以产生不同的结果。

1:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,10,100)
y = np.linspace(0,10,100)
y[10:40] = np.nan
plt.plot(x,y)
plt.savefig('fig')

2:

from pylab import *

x = linspace(0,10,100)
y = linspace(0,10,100)
y[10:40] = np.nan
plot(x,y)
savefig('fig')

代码#1产生一条直线,NaN区域用不同颜色的实线填充

代码#2生成一个直线的图形,但不用一条线填充NaN区域。相反,那里存在差距。

如何使代码#1代替NaN代码#2产生差距。我已经谷歌搜索了几天,并没有得到什么。任何帮助或建议将不胜感激。提前致谢

1 个答案:

答案 0 :(得分:3)

只是为了解释可能发生的事情:

您展示的两段代码完全相同。如果自己调用它们,它们将始终产生相同的输出。 pylab基本上只是几行代码:(除此之外还有更多内容,但这是基本的想法。)

from numpy import *
from matplotlib.mlab import *
from matplotlib.pyplot import *

pylab.plot绝对没有办法引用与plt.plot不同的函数


但是,如果您只是致电plt.plot(或pylab.plot,它们是相同的功能),则会在当前数字上绘制。

如果您之前在该图上绘制了某些内容,它仍将存在。 (如果您熟悉matlab,matplotlib默认为hold('on')。您可以使用plt.hold更改此设置,但最好在python中更明确,只需创建一个新数字。)

基本上,你可能会这样做:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,10,100)
y = np.linspace(0,10,100)

plt.plot(x,y)
plt.savefig('fig')

然后,在同一个交互式ipython会话中,您执行了此操作:

y[10:40] = np.nan
plt.plot(x, y)
plt.savefig('fig')

因为你没有打电话给show,所以现在的数字仍然和以前一样。 “完整”线仍然存在于第二条线下方,而具有NaN的第二条线是不同的颜色,因为您绘制在相同的轴上。

这是使用面向对象接口的好主意的众多原因之一。通过这种方式,您可以清楚地了解 哪些轴并计算出您的情节。

例如:

fig, ax = plt.subplots()
ax.plot(x, y)
fig.savefig('test.png')

如果您不打算这样做,至少在您想要一个新图时总是明确地创建一个新的图形和/或轴。 (例如,先致电plt.figure()