【问题标题】:matplotlib NaN's vs pylab NaN'smatplotlib NaN 与 pylab NaN
【发布时间】:2014-04-01 22:25:26
【问题描述】:

我有两段相似的 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。我已经用谷歌搜索了几天,但一无所获。任何帮助或建议将不胜感激。提前致谢

【问题讨论】:

  • 这两个是相同的。你得到“一条用不同颜色的实线填充的 NaN 区域的直线”的唯一方法是,如果你绘制了同一条线两次,而第一次没有NaNs。您是否将这两段代码一起运行?如果是这样,他们将绘制在同一个图上。
  • 我使用内联后端得到了相同的数字。您使用的是哪个后端?
  • 您几乎肯定会看到您在同一 ipython(或类似)会话中所做的绘图效果。如果您在长时间运行的交互式会话中工作,最好始终明确地创建一个新图形。

标签: python matplotlib interpolation nan


【解决方案1】:

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

您显示的两段代码是相同的。如果它们自己调用,它们将始终产生相同的输出。 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()

【讨论】:

  • @user3365990 - 你的数组是什么数据类型? NaN 是一个纯浮点值。如果将 NaN 分配给整数数组,它们将是一个很大的负数,而不是 NaN。
  • @user3365990 - 没有更多信息,我只是猜测,但请尝试明确指定数组的 dtype。例如。 np.array(y, dtype=float)
  • 只是为了记录,没有必要用 PIL 跳过所有这些箍。只是给fig.canvas.print_png(buffer)。此外,您不需要显式初始化 FigureFigureCanvas 对象,除非您想采用更复杂的路线。您可以使用fig, ax = plt.subplots()。如果您想使用特定的后端(例如,Agg 用于网络服务器),只需在导入 pyplot 之前调用 matplotlib.use(backend)
  • 但是,我看不出您发布的内容有什么问题。你能提供一个重现问题的独立示例吗?
  • 发现错误。我的数据没有排序。感谢您的帮助。
猜你喜欢
  • 2013-10-06
  • 2017-06-22
  • 1970-01-01
  • 2016-03-19
  • 2013-07-23
  • 1970-01-01
  • 2011-04-05
  • 2019-03-26
  • 2020-07-29
相关资源
最近更新 更多