在python中根据条件绘制五彩线

发布于 2021-01-29 15:25:32

我有一个带有三列和一个日期时间索引的熊猫数据框

date        px_last  200dma     50dma           
2014-12-24  2081.88 1953.16760  2019.2726
2014-12-26  2088.77 1954.37975  2023.7982
2014-12-29  2090.57 1955.62695  2028.3544
2014-12-30  2080.35 1956.73455  2032.2262
2014-12-31  2058.90 1957.66780  2035.3240

我想绘制一个“
px_last”列的时序图,如果在给定的一天50dma高于200dma值,则将其着色为绿色,如果50dma值低于200dma值,则将其着色为红色。我已经看到了这个示例,但似乎无法使其适用于我的情况
http://matplotlib.org/examples/pylab_examples/multicolored_line.html

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是不使用的示例matplotlib.collections.LineCollection。这个想法是首先确定交叉点,然后plot通过groupby使用函数。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    # simulate data
    # =============================
    np.random.seed(1234)
    df = pd.DataFrame({'px_last': 100 + np.random.randn(1000).cumsum()}, index=pd.date_range('2010-01-01', periods=1000, freq='B'))
    df['50dma'] = pd.rolling_mean(df['px_last'], window=50)
    df['200dma'] = pd.rolling_mean(df['px_last'], window=200)
    df['label'] = np.where(df['50dma'] > df['200dma'], 1, -1)
    
    
    # plot
    # =============================
    df = df.dropna(axis=0, how='any')
    
    fig, ax = plt.subplots()
    
    def plot_func(group):
        global ax
        color = 'r' if (group['label'] < 0).all() else 'g'
        lw = 2.0
        ax.plot(group.index, group.px_last, c=color, linewidth=lw)
    
    df.groupby((df['label'].shift() * df['label'] < 0).cumsum()).apply(plot_func)
    
    # add ma lines
    ax.plot(df.index, df['50dma'], 'k--', label='MA-50')
    ax.plot(df.index, df['200dma'], 'b--', label='MA-200')
    ax.legend(loc='best')
    

    在此处输入图片说明



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看