首页 > 解决方案 > 如何为绘图上的连续值添加阴影

问题描述

我有一个包含一段时间内价格信息的数据框。我还使用布尔值将某些时期标记为好转或低迷。我想绘制一段时间内的价格,并将上升 == True 的区域涂成绿色,将下降 == True 的区域涂成红色。我正在努力寻找一种方法来做到这一点。

编辑:我正在尝试使用 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}})

示例所需的输出:

线图顶部的阴影区域

标签: pythonpandasmatplotlibseaborn

解决方案


我从评论中的答案中得到提示并设置了背景。这是手动设置,因此如果您可以使用上升和下降来决定背景颜色会很棒,但这是当前的答案。

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

在此处输入图像描述


推荐阅读