matplotlib中的NaN与pylab中的NaN有何区别?

3
我有两个类似的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生成像代码#2一样的NaN间隙?我已经谷歌了几天,没有找到答案。任何帮助和建议将不胜感激。谢谢。

1
那两个是完全一样的。你能得到“用不同颜色的实线填充 NaN 区域的直线”的唯一方法就是将同一条线绘制两次,而第一次没有 NaN。你正在同时运行这两个代码片段吗?如果是这样,它们将绘制在同一张图上。 - Joe Kington
我使用内联后端得到了相同的图形。你使用的是哪个后端? - Paul H
3
如果你在同一个 ipython(或类似的)会话中进行了绘图,那么你几乎肯定会看到绘图效果。如果你正在进行长时间的交互式会话,最好始终明确地创建一个新的图形。请注意,这里不需要解释。 - Joe Kington
1个回答

3

这里简单解释一下可能发生的情况:

你展示的两段代码是相同的。如果它们被单独调用,它们总是会产生相同的输出结果。 pylab 基本上只是几行代码,它的作用是:(还有更多内容,但这是基本想法。)

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

pylab.plotplt.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,所以当前的图形仍然与之前相同。 “full”线仍然在第二条线下方,而带有NaN值的第二条线是不同颜色的,因为它是在同一坐标系上绘制的。
这就是为什么使用面向对象接口是一个好主意的其中之一。这样,您就可以清楚地知道要在哪个坐标轴和图形上绘制。
例如:
fig, ax = plt.subplots()
ax.plot(x, y)
fig.savefig('test.png')

如果您不这样做,至少在想要新建一个图形时始终明确地创建一个新的图形和/或坐标轴。(例如,通过调用plt.figure()开始)


1
@user3365990 - 你的数组使用了什么数据类型?NaN 只适用于浮点数。如果你将 NaN 赋给一个整型数组,它们将会变成一个很大的负数而非 NaN。 - Joe Kington
1
@user3365990 - 没有更多的信息,我只是猜测,但是尝试显式指定数组的dtype。例如:np.array(y, dtype=float) - Joe Kington
1
只是为了记录,使用 PIL 不需要跳过所有的这些步骤。只需要fig.canvas.print_png(buffer)。而且你不需要显式地初始化 FigureFigureCanvas 对象,除非你想采用更复杂的路径。你可以直接使用 fig,ax=plt.subplots()。如果你想使用特定的后端(例如Agg用于 Web 服务器),只需在导入 pyplot 之前调用 matplotlib.use(backend) 即可。 - Joe Kington
1
然而,我看不出你发布的内容有什么问题。你能提供一个独立的示例来重现这个问题吗? - Joe Kington
1
发现错误,我的数据没有排序。谢谢你的帮助。 - user3365990
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接