Python 如何正确地绘图?

Python 如何正确地绘图?,python,pandas,matplotlib,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|

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

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

也许有一种方法可以在不制作额外数据帧的情况下构建这样一个图?

以一种不优雅的方式解决了这个问题,因此我们仍然非常感谢您的帮助

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

以一种不优雅的方式解决了这个问题,所以我们仍然感谢您的帮助

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