如何正确绘制情节?

时间:2019-10-22 06:49:30

标签: python pandas matplotlib

我有一个具有以下结构的数据框:

Obj | Err   | Start    | End      | Dur   |   
obj1|  ac   |{datetime}|{datetime}| 1.0   |
obj1|  dc   |{datetime}|{datetime}| 3.0   | 
obj1|  loc  |{datetime}|{datetime}| 4.0   | 
obj2|  ac   |{datetime}|{datetime}| 1.0   | 
obj2|  loc  |{datetime}|{datetime}| 1.0   |   

我正在尝试建立一个散点图,其中x轴是AC错误的开始时间,y轴= AC开始时间与另一个错误的开始时间之间的差。

我尝试了什么。
我制作了一个具有计算的时差的数据框,如下所示:

Obj | Err   | Start    | End      | Dur   | Err_y | Start_y  | End_y    | Dur_y | Time diff  
obj1|  ac   |{datetime}|{datetime}| 1.0   | dc    |{datetime}|{datetime}| 3.0   | 2.0
obj1|  ac   |{datetime}|{datetime}| 3.0   | cell  |{datetime}|{datetime}| 1.0   | 0.0  
obj1|  ac   |{datetime}|{datetime}| 4.0   | loc   |{datetime}|{datetime}| 1.0   | 3.0
obj2|  ac   |{datetime}|{datetime}| 1.0   | loc   |{datetime}|{datetime}| 3.0   | 2.0

但是当我尝试绘制它时,我得到一个错误,即x和y轴必须具有相同的长度。这是我的绘图代码:

for obj in data['Obj'].unique():
   AC = data[data['Obj']==obj].reset_index(drop=True)
   plt.figure(figsize=(10,5))
   plt.scatter(AC[AC['Err_x']=='ac']['Start_x'].tolist(),AC[AC['Alarm_y']=='dc']['Time diff'],c='b', label = 'Battery')
   plt.scatter(AC[AC['Err_x']=='ac']['Start_x'].tolist(),AC[AC['Alarm_y']=='loc']['Time diff'],c='b', label = 'Loc')  
   plt.scatter(AC[AC['Err_x']=='ac']['Start_x'].tolist(),AC[AC['Alarm_y']=='cell']['Time diff'],c='b', label = 'Cell')
   plt.ylim(0,200)
   plt.title(obj)
   plt.legend()  

也许有一种无需制作额外数据框就能建立这样一个情节的方法吗?

1 个答案:

答案 0 :(得分:0)

以一种不太优雅的方式解决了该问题,因此仍然感谢您的帮助。

for obj in data['Obj'].unique():    #used the initial dataframe
    DDT=data[data['Obj']=='obj].reset_index(drop=True)    
    DDT['key'] = ((DDT.Obj != DDT.Obj.shift())|(DDT.Err == 'ac')).cumsum()  
    DDDD = pd.merge(DDT.loc[DDT['Err']=='ac'],     #
                 DDT.loc[DDT['err']=='dc'],        #
                 on=['Obj', 'key'],                #
                 how='left')                       # the problem is that this
    DDDD['time_diff'] = (DDDD['Start_y'] -         # part of code needed
    DDDD['Start_x']).dt.total_seconds()//60        # to be duplicated for
    DDDD.dropna(inplace=True)                      # every err that is
    DDDD=DDDD[DDDD['time_diff'] > 0]               # compared with ac
    DDDD=DDDD[DDDD['Dur_x'] >= DDDD['time_diff']]  #
    plt.figure(figsize=(15,7))  
    plt.scatter(DDT[DDT['Err']=='ac']['Start'].tolist(), 
        DDT[DDT['Err']=='ac']['Dur'], c='b', label='AC', s=10)
    plt.scatter(DDDD['Start_x'].tolist(), DDDD['time_diff'], c='g', label = 'DC')  
    plt.legend()