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