使用 NaN 绘制/创建数据集的散点图
Posted
技术标签:
【中文标题】使用 NaN 绘制/创建数据集的散点图【英文标题】:Draw / Create Scatterplots of datasets with NaN 【发布时间】:2013-03-23 04:05:06 【问题描述】:我想用pylab画一个散点图,但是我的一些数据是NaN
,像这样:
a = [1, 2, 3]
b = [1, 2, None]
pylab.scatter(a,b)
不起作用。
有没有什么方法可以在不显示这些NaN
值的情况下绘制真正有价值的点?
【问题讨论】:
删除 ***.com/questions/11620914/… 中描述的 NaN 值是否足够? 【参考方案1】:如果您使用NaN
s,一切都会完美无缺。 None
不是一回事。 NaN
是一个浮点数。
举个例子:
import numpy as np
import matplotlib.pyplot as plt
plt.scatter([1, 2, 3], [1, 2, np.nan])
plt.show()
如果您想处理丢失的数据,请查看 pandas
或 numpy 掩码数组(以及 numpy.genfromtxt
以加载您的数据)。屏蔽数组内置于 numpy 中,但 pandas
是一个非常有用的库,并且具有非常好的缺失值功能。
举个例子:
import matplotlib.pyplot as plt
import pandas
x = pandas.Series([1, 2, 3])
y = pandas.Series([1, 2, None])
plt.scatter(x, y)
plt.show()
pandas
使用NaN
s 来表示掩码数据,而掩码数组使用单独的掩码数组。这意味着掩码数组可以潜在地保留原始数据,同时暂时将其标记为“丢失”或“坏”。但是,它们使用更多的内存,并且有一个隐藏的陷阱,可以通过使用NaN
s 来表示缺失的数据来避免。
再举一个例子,同时使用掩码数组和NaN
s,这次是用线图:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 6 * np.pi, 300)
y = np.cos(x)
y1 = np.ma.masked_where(y > 0.7, y)
y2 = y.copy()
y2[y > 0.7] = np.nan
fig, axes = plt.subplots(nrows=3, sharex=True, sharey=True)
for ax, ydata in zip(axes, [y, y1, y2]):
ax.plot(x, ydata)
ax.axhline(0.7, color='red')
axes[0].set_title('Original')
axes[1].set_title('Masked Arrays')
axes[2].set_title("Using NaN's")
fig.tight_layout()
plt.show()
【讨论】:
这就是我要找的。谢谢! 如果您使用 NaN 和符号学,事情将无法完美运行...情节看起来不错,但会引发以下警告:RuntimeWarning: invalid value seen in less_equal mask = a 【参考方案2】:因为您是在 2D 空间中绘制的,所以您的点需要同时由 X 和 Y 值定义。如果其中一个值为 None,则该点不能存在于 2D 空间中,因此无法绘制,因此您应该从另一个列表中删除 None 及其对应的值。
有很多方法可以做到这一点。这是一个:
a = [1, 2, 3]
b = [1, None, 2]
i = 0
while i < len(a):
if a[i] == None or b[i] == None:
a = a[:i] + a[i+1:]
b = b[:i] + b[i+1:]
else:
i += 1
"""Now a = [1, 3] and b = [1, 2]"""
pylab.scatter(a,b)
【讨论】:
小心if not a[i]...
。如果任一数组有零,您将删除它们。零是一个完全有效的值!以上是关于使用 NaN 绘制/创建数据集的散点图的主要内容,如果未能解决你的问题,请参考以下文章