标记 Pandas 图中插值的 NaN 点

egp*_*bos 4 python plot data-visualization matplotlib pandas

当我在 Pandas 中使用插值(或fillna,或任何其他生成一些假数据的方法)时,我希望它显示在我的图中。理想情况下,我想对图中的这些点使用不同的标记。对于常规点,我想使用实心圆圈 ( 'o'),对于假数据,我想使用十字 ( 'x')。

当然,我想用一个漂亮的Pythonic oneliner来做到这一点。

另一个复杂之处是我想使用subplots绘图函数中的选项来一次绘制所有列。我希望用 Matplotlib voodoo 操作子图是没有必要的,尽管目前这是我能想到的唯一选择。

我正在使用的数据如下所示(放入文件“meterstanden.ssv”中):

datum       tijd   gas[m^3]   electra1[kWh] electra2[kWh]  water[m^3]
2015-03-06  09:00  4000.318   10300         9000           300.0
2015-03-24  20:10  4020.220   -             10003          -
2015-08-02  11:15  4120.388   10500         11000          350.5
Run Code Online (Sandbox Code Playgroud)

这是我用来处理它的脚本:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_table("meterstanden.ssv", delim_whitespace=True,
                   parse_dates=[[0, 1]], index_col=0, na_values=['-'])

df.interpolate(method='time').plot(subplots=True, layout=(2, 2),
                                   figsize=(14, 10), marker='o')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我希望-表中的条目用十字标记绘制。

Joh*_*hnE 5

我想不出Pythonic的一句台词,但也许这可以。(使用散点图,您将有更多选择,例如使用 kwarg s,尽管我不确定它最终是否比此解决方案更好。)

np.random.seed(123)
df=pd.DataFrame({ 'x':np.random.choice([1,2,np.nan],20),
                  'y':np.random.choice([3,4,np.nan],20) },
                  index=pd.date_range('2015-1-1',periods=20) )
Run Code Online (Sandbox Code Playgroud)

我认为,无论具体方法如何,都需要设置两个在包含估算值方面有所不同的数据框。我会这样做。

mask=df.isnull()
df=df.interpolate(method='time')
imputed=df[mask]
Run Code Online (Sandbox Code Playgroud)

然后只需将两个线图重叠即可。第一个是正常完成的,但第二个没有线条,只包含估算值。您不关心估算值的连接线,但您确实想查看这些点,因此您给它们一个区分标记。我按照您的要求使用“o”而不是“x”,因为“o”显示得更清晰一些,但当然您可以更改它。

for c in df.columns:
    plt.plot(df[c])
    plt.plot(imputed[c],linestyle='',marker='o')
    plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

您还可以考虑使用线条颜色来传达有关图表的哪些部分基于估算值的信息。有多种方法可以做到这一点,这里是其中一种。

not_imp=df[~mask]

for c in df.columns:
    plt.plot(df[c],color='r')
    plt.plot(not_imp[c],color='b',marker='o')
    plt.plot(imputed[c],color='r',marker='d',linestyle='')
    plt.show()
Run Code Online (Sandbox Code Playgroud)

因此,这里发生的情况是,蓝色(圆形)标记表示真实(非估算)值,蓝线将真实值连接到真实值。红色(菱形)标记表示估算值,红线将估算值连接到其他估算值或实际值。

在此输入图像描述

在此输入图像描述