当我在Pandas中使用插值(或fillna,或任何其他生成某些伪数据的方法)时,我希望在我的图中显示.理想情况下,我想在图中为这些点使用不同的标记.对于常规点,我想使用实心圆(‘o’),对于假数据,我想使用十字(‘x’).
当然,我想用漂亮的Pythonic oneliner做到这一点.
另一个复杂因素是我想使用plot函数中的subplots选项一次绘制所有列.我希望用Matplotlib voodoo操纵子图是没有必要的,虽然在这一点上,这是我能想到的唯一选择.
我正在使用的数据类似于以下内容(放入文件’metertanden.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
这是我用来处理它的脚本:
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()
我希望表中的 – 条目用交叉标记绘制.
解决方法:
我不能想出pythonic单线,但也许这样做. (使用散点图你会有更多的选择,比如使用s kwarg,虽然我不确定它最终会比这个解决方案更好.)
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) )
我认为无论采用何种确切的方法,都需要设置两个数据帧,这些数据帧在包含估算值方面有所不同.我会这样做的.
mask=df.isnull()
df=df.interpolate(method='time')
imputed=df[mask]
然后,这只是覆盖两个线图的问题.一个正常完成,但第二个没有线,只包括推算值.您不关心来自插补值的连接线,但您确实希望看到这些点,因此您可以为它们提供区分标记.我正在按你的要求使用’o’而不是’x’,因为’o’显示得更清楚,但你当然可以改变它.
for c in df.columns:
plt.plot(df[c])
plt.plot(imputed[c],linestyle='',marker='o')
plt.show()
您还可以考虑使用线条颜色来传达有关图形的哪些部分基于插补值的信息.有几种方法可以做到这一点,这是一个.
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()
所以这里发生的是蓝色(圆圈)标记表示真实(非插曲)值,蓝线表示真实与真实.红色(菱形)标记表示插补值,红色线将插补值连接到其他插补值或实际值.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。