我有一些数据,X 和 Y,我想将其简单地绘制为 X 与 Y。
但是,对于 Y 的某些元素,没有数据。我将其记录为
None
而不是 0,因为 matplotlib 不会绘制它(我不想画一条线向下到零并返回)。
如果我这样做,我注意到这会起作用:
import numpy as np
import matplotlib.pyplot as plt
X = np.array([1,2,3,4])
Y = np.array([1,2,3,None])
Y_ERR = np.array([1,1,1,None])
plt.errorbar(X, Y, yerr = Y_ERR)
plt.show()
但是,当我使用列表代替时,我收到错误:
X = [1,2,3,4]
Y = [1,2,3,None]
plt.errorbar(X, Y, yerr = Y_ERR)
plt.show()
TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'
我还意识到,如果我在
.tolist()
函数内的 numpy 数组上使用 plt.errorbar
函数,则不会发生错误,当我想象这应该相当于使用列表时。例如:
X = np.array([1,2,3,4])
Y = np.array([1,2,3,None])
Y_ERR = np.array([1,1,1,None])
plt.errorbar(X.tolist(), Y.tolist(), yerr = Y_ERR.tolist())
plt.show()
为什么会这样?
我认为 numpy 自动将
None
视为对象数据类型数组,因为通常 None
不是数值数组中的有效值。当您使用 tolist()
时,numpy 还可以帮助进行转换,并将 None
值转换为 np.nan
(不是数字),这是一个有效的数值。
您可以在列表中使用
np.nan
代替 None
:
import numpy as np
import matplotlib.pyplot as plt
X = [1, 2, 3, 4]
Y = [1, 2, 3, np.nan]
Y_ERR = [1, 1, 1, np.nan]
plt.errorbar(X, Y, yerr=Y_ERR)
plt.show()
这仍然是 matplotlib 不会绘制它,并且你不会得到
unsupported operand type
错误。