Matplotlib 如何使用NaN值绘制连续线图?

Matplotlib 如何使用NaN值绘制连续线图?,matplotlib,pandas,Matplotlib,Pandas,如何在忽略NaN数据的情况下绘制直线图,以获得连续直线?例如,通过下面的数据,每一次观测都是相互联系的 cpu = DataFrame.from_dict({'{host=ny-service05}': {Timestamp('2014-10-16 14:19:36'): nan, Timestamp('2014-10-16 14:19:41'): 19.199999999999999, Timestamp('2014-10-16 14:19:51'): nan, Timestamp('2

如何在忽略NaN数据的情况下绘制直线图,以获得连续直线?例如,通过下面的数据,每一次观测都是相互联系的

cpu = DataFrame.from_dict({'{host=ny-service05}': {Timestamp('2014-10-16 14:19:36'): nan,
 Timestamp('2014-10-16 14:19:41'): 19.199999999999999,
 Timestamp('2014-10-16 14:19:51'): nan,
 Timestamp('2014-10-16 14:19:56'): 17.333333333333332,
 Timestamp('2014-10-16 14:20:06'): nan},
'{host=ny-service04}': {Timestamp('2014-10-16 14:19:36'): 13.866666666666667,
 Timestamp('2014-10-16 14:19:41'): nan,
 Timestamp('2014-10-16 14:19:51'): 12.466666666666667,
 Timestamp('2014-10-16 14:19:56'): nan,
 Timestamp('2014-10-16 14:20:06'): 18.399999999999999}})


如果每个其他数据都是NaN,则可以使用以下方法之一对其进行切片:

plot(time[::2], dat[::2])
plot(time[1::2], dat[1::2])
或者,如果数据不太规则,可以创建用于创建新阵列的逻辑阵列:

logic_array = ~(np.isnan(dat))

plot(time[logic_array], dat[logic_array])

请注意,后一种方法不是很有效,因为它创建数组副本而不是视图(),但这就是它的工作方式。

如果其他所有数据都是NaN,则可以使用以下方法之一对其进行切片:

plot(time[::2], dat[::2])
plot(time[1::2], dat[1::2])
或者,如果数据不太规则,可以创建用于创建新阵列的逻辑阵列:

logic_array = ~(np.isnan(dat))

plot(time[logic_array], dat[logic_array])

请注意,后一种方法不是很有效,因为它创建数组副本而不是视图(),但这就是它的工作方式。

使用
interpolate()


使用
interpolate()
如何:



只有两列,
nan
s是交错的?在这种情况下,
cpu.fillna(method='pad')[::2].plot()
就足够了。@CTZhu:不,正在寻找一种通用的解决方案,其中数据帧是N列,而NaN可以是任意位置,但是如何“对齐”数据?比如说,如果
nan
s没有被固定的步长交错?因为您的数据显示为一个时间序列,所以可能会将其减采样到每分钟(或其他时间)?当然,如果对齐不是问题,@farenorth的解决方案会起作用。是的,我不关心对齐在这种情况下只有两列,
nan
s是交错的?在这种情况下,
cpu.fillna(method='pad')[::2].plot()
就足够了。@CTZhu:不,正在寻找一种通用的解决方案,其中数据帧是N列,而NaN可以是任意位置,但是如何“对齐”数据?比如说,如果
nan
s没有被固定的步长交错?因为您的数据显示为一个时间序列,所以可能会将其减采样到每分钟(或其他时间)?当然,如果对齐不是一个问题,@farenorth的解决方案会起作用。是的,我不关心对齐在这种情况下有没有可能有一点汤匙喂?不知道如何将此应用于我的数据帧…您需要为我(或任何人)提供一个更完整的问题,以便“用勺子喂”您。i、 e.提供一个可以执行的最小示例代码,以获得具有NaN值的数据对象。这就是您要寻找的:
cpu[~np.isnan(cpu[{host=ny-service04}]]]].plot(marker='.)
我想问题是我不想更改数据,而只是更改绘图。我猜matplotlib就是不能那样工作。但我想我可以通过在NAN中填入前后点的平均值来获得相同的视觉效果(若不使用标记的话)。它产生了一个被绘制的副本。有没有可能会有一点小汤匙?不知道如何将此应用于我的数据帧…您需要为我(或任何人)提供一个更完整的问题,以便“用勺子喂”您。i、 e.提供一个可以执行的最小示例代码,以获得具有NaN值的数据对象。这就是您要寻找的:
cpu[~np.isnan(cpu[{host=ny-service04}]]]].plot(marker='.)
我想问题是我不想更改数据,而只是更改绘图。我猜matplotlib就是不能那样工作。但我想我可以通过在NAN中填入前后点的平均值来获得相同的视觉效果(若不使用标记的话)。它生成一个打印的副本。