Python 如何为绘图上的连续值添加着色

Python 如何为绘图上的连续值添加着色,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我有一个包含价格信息的数据框。我还用布尔值将某些时期标记为上升或下降。我想画出一段时间内的价格,并将上升==真的区域涂成绿色,而下降==真的区域涂成红色。我正在努力想办法做到这一点 编辑:我正在尝试使用matplotlib/seaborn在一段时间内绘制线条图,并希望对“真实”区域进行着色。我尝试使用ax.axvspan执行此操作,但不确定如何传递x的正确索引 有什么想法吗 price upturn downturn 2016-12-31 954.62

我有一个包含价格信息的数据框。我还用布尔值将某些时期标记为上升或下降。我想画出一段时间内的价格,并将上升==真的区域涂成绿色,而下降==真的区域涂成红色。我正在努力想办法做到这一点

编辑:我正在尝试使用matplotlib/seaborn在一段时间内绘制线条图,并希望对“真实”区域进行着色。我尝试使用ax.axvspan执行此操作,但不确定如何传递x的正确索引

有什么想法吗

                  price  upturn  downturn
2016-12-31   954.623021   False      True
2017-01-01   973.662396   False      True
2017-01-02  1011.492500   False      True
2017-01-03  1020.493750    True     False
2017-01-04  1076.784792    True     False
2017-01-05  1051.258854    True     False
2017-01-06   931.354688    True     False
2017-01-07   865.056667   False      True
2017-01-08   908.179063   False      True
2017-01-09   891.121979   False      True
2017-01-10   900.545208   False      True
2017-01-11   845.028437   False      True
2017-01-12   780.695313   False      True
2017-01-13   805.582187   False     False
2017-01-14   827.220625   False     False
以下是便于使用的数据框:

import pandas as pd
from pandas import Timestamp

df = pd.DataFrame({'price': {Timestamp('2016-12-31 00:00:00'): 954.6230208333336,
  Timestamp('2017-01-01 00:00:00'): 973.6623958333333,
  Timestamp('2017-01-02 00:00:00'): 1011.4925000000002,
  Timestamp('2017-01-03 00:00:00'): 1020.4937500000001,
  Timestamp('2017-01-04 00:00:00'): 1076.784791666667,
  Timestamp('2017-01-05 00:00:00'): 1051.2588541666669,
  Timestamp('2017-01-06 00:00:00'): 931.3546875000002,
  Timestamp('2017-01-07 00:00:00'): 865.0566666666665,
  Timestamp('2017-01-08 00:00:00'): 908.1790625000002,
  Timestamp('2017-01-09 00:00:00'): 891.1219791666667,
  Timestamp('2017-01-10 00:00:00'): 900.5452083333333,
  Timestamp('2017-01-11 00:00:00'): 845.0284375,
  Timestamp('2017-01-12 00:00:00'): 780.6953125000001,
  Timestamp('2017-01-13 00:00:00'): 805.5821874999998,
  Timestamp('2017-01-14 00:00:00'): 827.2206249999999},
 'upturn': {Timestamp('2016-12-31 00:00:00'): False,
  Timestamp('2017-01-01 00:00:00'): False,
  Timestamp('2017-01-02 00:00:00'): False,
  Timestamp('2017-01-03 00:00:00'): True,
  Timestamp('2017-01-04 00:00:00'): True,
  Timestamp('2017-01-05 00:00:00'): True,
  Timestamp('2017-01-06 00:00:00'): True,
  Timestamp('2017-01-07 00:00:00'): False,
  Timestamp('2017-01-08 00:00:00'): False,
  Timestamp('2017-01-09 00:00:00'): False,
  Timestamp('2017-01-10 00:00:00'): False,
  Timestamp('2017-01-11 00:00:00'): False,
  Timestamp('2017-01-12 00:00:00'): False,
  Timestamp('2017-01-13 00:00:00'): False,
  Timestamp('2017-01-14 00:00:00'): False},
 'downturn': {Timestamp('2016-12-31 00:00:00'): True,
  Timestamp('2017-01-01 00:00:00'): True,
  Timestamp('2017-01-02 00:00:00'): True,
  Timestamp('2017-01-03 00:00:00'): False,
  Timestamp('2017-01-04 00:00:00'): False,
  Timestamp('2017-01-05 00:00:00'): False,
  Timestamp('2017-01-06 00:00:00'): False,
  Timestamp('2017-01-07 00:00:00'): True,
  Timestamp('2017-01-08 00:00:00'): True,
  Timestamp('2017-01-09 00:00:00'): True,
  Timestamp('2017-01-10 00:00:00'): True,
  Timestamp('2017-01-11 00:00:00'): True,
  Timestamp('2017-01-12 00:00:00'): True,
  Timestamp('2017-01-13 00:00:00'): False,
  Timestamp('2017-01-14 00:00:00'): False}})
所需输出示例:


我从评论中的答案中获取线索,并设置了背景。这是一个手动设置,所以如果你能用上升和下降来决定背景色,那就太好了,但这是目前的答案

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime

fig, ax = plt.subplots(figsize=(16,5))

ax.plot(df.index, df['price'])
s_date = mdates.date2num(df.index[0])
e_date = mdates.date2num(df.index[2])
ax.axvspan(s_date, e_date, color='g', alpha=0.4)
s_date1 = mdates.date2num(df.index[2])
e_date1 = mdates.date2num(df.index[6])
ax.axvspan(s_date1, e_date1, color='r', alpha=0.4)
s_date2 = mdates.date2num(df.index[6])
e_date2 = mdates.date2num(df.index[11])
ax.axvspan(s_date2, e_date2, color='g', alpha=0.4)
plt.show()

我从评论中的答案中获取线索,并设置了背景。这是一个手动设置,所以如果你能用上升和下降来决定背景色,那就太好了,但这是目前的答案

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime

fig, ax = plt.subplots(figsize=(16,5))

ax.plot(df.index, df['price'])
s_date = mdates.date2num(df.index[0])
e_date = mdates.date2num(df.index[2])
ax.axvspan(s_date, e_date, color='g', alpha=0.4)
s_date1 = mdates.date2num(df.index[2])
e_date1 = mdates.date2num(df.index[6])
ax.axvspan(s_date1, e_date1, color='r', alpha=0.4)
s_date2 = mdates.date2num(df.index[6])
e_date2 = mdates.date2num(df.index[11])
ax.axvspan(s_date2, e_date2, color='g', alpha=0.4)
plt.show()