8

我想使用 pylab 绘制散点图,但是,我的一些数据是NaN,像这样:

a = [1, 2, 3]
b = [1, 2, None]

pylab.scatter(a,b)不起作用。

有什么方法可以在不显示这些NaN值的情况下绘制真正的价值点吗?

4

2 回答 2

17

如果您使用NaNs,一切都会完美无缺。 None不是一回事。ANaN是一个浮点数。

举个例子:

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使用NaNs 表示掩码数据,而掩码数组使用单独的掩码数组。这意味着掩码数组可以潜在地保留原始数据,同时暂时将其标记为“丢失”或“坏”。但是,它们使用更多的内存,并且有一个隐藏的陷阱,可以通过使用NaNs 来表示缺失的数据来避免。

作为另一个示例,同时使用掩码数组和NaNs,这次使用折线图:

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()

在此处输入图像描述

于 2013-04-02T01:04:48.093 回答
1

因为您是在 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)
于 2013-04-02T01:05:08.470 回答