python - 如何为绘图上的连续值添加阴影
问题描述
我有一个包含一段时间内价格信息的数据框。我还使用布尔值将某些时期标记为好转或低迷。我想绘制一段时间内的价格,并将上升 == 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}})
示例所需的输出:
解决方案
我从评论中的答案中得到提示并设置了背景。这是手动设置,因此如果您可以使用上升和下降来决定背景颜色会很棒,但这是当前的答案。
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()
推荐阅读
- javascript - 当我在我的文本框中输入故事时,它应该点击这个 api
- c - 功能不起作用(我的第一个 C 项目)
- python - 如何在 Python 中拥有类似于 Javascript 回调的东西
- python - 如何根据今天的日期向 csv/sqlite 添加新列?
- javascript - 在 next.js 的 getInitialProps 中使用后端数据渲染页面
- javascript - new Date() 在 JavaScript 中的行为不一致
- oop - 向下转换和向上转换的更好表达?
- json - 可以使用任何吗?当我们不确定我们的模型将接收什么数据类型时,在我们的模型类中
- python - 将日期时间条目插入到具有 TIMESTAMP 数据类型的表中
- mql4 - MQL4 发送对象数组作为函数参数