Python Matplot:如果满足条件,则在图上用点表示

Python Matplot:如果满足条件,则在图上用点表示,python,pandas,matplotlib,Python,Pandas,Matplotlib,我的数据框如下所示: time price direction event High_cross movement_up triggered_up 26 2019-01-01 11:37:57.434 0.00224242 up crossing up True False 27 2019-01-01 11:37:57.784 0.00224243 up 0 Fals

我的数据框如下所示:

                     time   price   direction   event   High_cross  movement_up triggered_up    
    26  2019-01-01 11:37:57.434 0.00224242  up   crossing up   True  False  
    27  2019-01-01 11:37:57.784 0.00224243  up     0         False  False           
    28  2019-01-01 11:38:38.575 0.00224171  up     0         False  False           
    29  2019-01-01 11:38:57.602 0.00224311  up     0         False  False       
    30  2019-01-01 11:39:21.907 0.00224473  up     0         True   movement        
    31  2019-01-01 11:39:40.320 0.00224422  up     0         True   True        
    32  2019-01-01 11:40:16.966 0.00224697  up     0         True   True    
    33  2019-01-01 11:41:16.966 0.00224694  down    0        True   Movement
    34  2019-01-01 11:42:16.966 0.00224674  down    0        false  false
    35  2019-01-01 11:43:16.966 0.00224672  down crossing down false    false Yes
您好,我需要的是在满足某些条件时,在图形上用一个点指示一个特定的值。目前,我只将价格与时间作了如下对比:

df['price']=df.price.astype(float)
df.绘图(y='price',x='time')

我现在需要的是当列
高交叉
被设置为
并且在同一行上列
向上移动
等于
移动
在价格上加一个点。当列
事件
等于
向下交叉
向上触发
时,也要执行同样的操作。最后,当
事件
向下交叉
向上触发
等于
。。。。我看了一下文档,但找不到关于如何使用多个条件的解释。。。有什么帮助吗?谢谢

这就是我试图找到符合条件的行的原因:

`movement= df[(df.High_cross == True) & (df.movement_up == 'movement')]
price_movement = movement.price

crossing_yes = df[(df.event == 'crossing down') & (df.triggered_up == 'Yes')]
price_crossing_yes = crossing_yes.price

crossing_no = df[(df.event == 'crossing down') & (df.triggered_up == 'No')]
price_crossing_no = crossing_no.price`

但是我一直在研究如何在图表上绘制这些价格。

您可以使用

plt.scatter(movement['time'].tolist(), price_movement.tolist(), marker='o')
plt.scatter(crossing_yes['time'].tolist(), price_crossing_yes.tolist(), marker='.')
plt.scatter(crossing_no['time'].tolist(), price_crossing_no.tolist(), marker='+')
movement
crossing\u yes
crossing\u no
DataFrame
对象,因此必须指定列。这相当于

time_movement = movement.time
plt.scatter(time_movement.tolist(), price_movement.tolist())
但稍微不那么冗长。当然,您可以通过执行 内联过滤

plt.scatter(df[(df.High_cross == True)&(df.movement_up == 'movement')]['time'].tolist(), 
            df[(df.High_cross == True)&(df.movement_up == 'movement')]['price'].tolist(),
            marker='o')
plt.scatter(df[(df.event == 'crossing down')&(df.triggered_up == 'Yes')]['time'].tolist(),
            df[(df.event == 'crossing down')&(df.triggered_up == 'Yes')]['price'].tolist(),
            marker='.')
plt.scatter(df[(df.event == 'crossing down')&(df.triggered_up == 'No')]['time'].tolist(), 
            df[(df.event == 'crossing down')&(df.triggered_up == 'No')]['price'].tolist(), 
            marker='+')
这稍微简洁一些,有利于循环,但确实需要第二次循环,否则就不那么密集了

下面是使用提供的数据的完整示例

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
     [['2019-01-01 11:37:57.434', 0.00224242, 'up', 'crossing up', True, False],
      ['2019-01-01 11:37:57.784', 0.00224243, 'up', 0, False, False],
      ['2019-01-01 11:38:38.575', 0.00224171, 'up', 0, False, False],
      ['2019-01-01 11:38:57.602', 0.00224311, 'up', 0, False, False],
      ['2019-01-01 11:39:21.907', 0.00224473, 'up', 0, True, 'movement'],
      ['2019-01-01 11:39:40.320', 0.00224422, 'up', 0, True, True],        
      ['2019-01-01 11:40:16.966', 0.00224697, 'up', 0, True, True],
      ['2019-01-01 11:41:16.966', 0.00224694, 'down', 0, True, 'Movement'],
      ['2019-01-01 11:42:16.966', 0.00224674, 'down', 0, False, False],
      ['2019-01-01 11:43:16.966', 0.00224672, 'down', 'crossing down', 
        False, False, 'Yes']])

df.columns = ['time', 'price', 'direction', 'event', 'High_cross', 
              'movement_up', 'triggered_up']

df['price'] = df.price.astype(float)
df['time'] = pd.to_datetime(df['time'])
df.plot(y='price', x='time', legend=False)
plt.scatter(df[(df.High_cross == True)&(df.movement_up == 'movement')]['time'].tolist(), 
            df[(df.High_cross == True)&(df.movement_up == 'movement')]['price'].tolist(),
            marker='o')
plt.scatter(df[(df.event == 'crossing down')&(df.triggered_up == 'Yes')]['time'].tolist(),
            df[(df.event == 'crossing down')&(df.triggered_up == 'Yes')]['price'].tolist(),
            marker='.')
plt.scatter(df[(df.event == 'crossing down')&(df.triggered_up == 'No')]['time'].tolist(), 
            df[(df.event == 'crossing down')&(df.triggered_up == 'No')]['price'].tolist(), 
            marker='+')
plt.ylabel("Price")
plt.xlabel("Time")
plt.show()