Python 如何在matplotlib pyplot中更改图形颜色并绘制垂直着色矩形?

Python 如何在matplotlib pyplot中更改图形颜色并绘制垂直着色矩形?,python,matplotlib,Python,Matplotlib,我有这个数据框: A a_red green_bar date 2020-01-01 5 False False 2020-01-02 6 True False 2020-01-03 7 True False 2020-01-04 4 False True 2020-01-05 5 False True 2020-01-06 5 Fa

我有这个数据框:

            A  a_red  green_bar
date                           
2020-01-01  5  False      False
2020-01-02  6   True      False
2020-01-03  7   True      False
2020-01-04  4  False       True
2020-01-05  5  False       True
2020-01-06  5  False      False
从A列,我在图表中画了一条线:

我想添加两个功能:

  • 只有在列a_red中的值为True的日子,我才想将蓝线(从列a)的颜色更改为红色。在所有其他日子里,它应该保持蓝色
  • 只有在绿色栏栏中的值为真的日子,我才想画一个半透明的绿色垂直矩形,它横跨一天的宽度和图表的整个高度。本质上,这一天是特别的。连续多天应显示为一个连续的绿色块
  • 这是我的密码:

    import matplotlib.pyplot as plt
    import pandas as pd
    
    # create sample dataframe
    import io
    data = io.StringIO("""
    date|A|a_red|green_bar
    2020-01-01|5|False|False
    2020-01-02|6|True|False
    2020-01-03|7|True|False
    2020-01-04|4|False|True
    2020-01-05|5|False|True
    2020-01-06|5|False|False""")
    df = pd.read_csv(data, sep='|', parse_dates=['date'])
    df = df.set_index('date')
    
    # draw plot
    with plt.style.context('seaborn'):
        plt.plot(df['A'], color='blue')
        plt.show()
    

    非常感谢你的帮助,我真的很感激

    可以通过逐行循环数据帧来创建所需的绘图。请注意,日期是绘图上的点,而直线位于两个连续日期之间。因此,最后一个日期不会有一行或一条线(为了缓解这种情况,您可以附加一个虚拟的最后一个日期)

    导入matplotlib.pyplot作为plt
    作为pd进口熊猫
    输入io
    #创建示例数据帧
    数据=io.StringIO(“”)
    日期| A | A |红色|绿色|条
    2020-01-01 | 5 |假|假
    2020-01-02 | 6 |对|错
    2020-01-03 | 7 |对|错
    2020-01-04 | 4 |假|真
    2020-01-05 | 5 |假|真
    2020-01-06 | 5 |假|假
    df=pd.read_csv(数据,sep='|',parse_dates=['date'])
    df=df.set_索引(“日期”)
    #绘图
    使用plt.style.context('seaborn'):
    对于i,枚举(zip(df['a\u red'][:-1],df['green\u bar'][:-1])中的(a\u red,green\u bar):
    plt.plot(df['A'][i:i+2],如果A是红色,则颜色为红色,否则颜色为蓝色)
    如果为绿色,请单击工具栏:
    plt.axvspan(测向指数[i],测向指数[i+1],颜色为绿色,α=0.2)
    plt.show()
    

    这太完美了,谢谢!最后一次约会对我来说没问题。我会将您的解决方案应用到我的大型数据帧。如果循环速度太慢,我可以先重新采样使其变小。