【问题标题】:How to create a plot with vertical shades in matplotlib [duplicate]如何在matplotlib中创建具有垂直阴影的图[重复]
【发布时间】:2021-03-28 09:27:07
【问题描述】:

我希望能够复制以下情节。

x 轴上我有时间,y 轴上我有 GDP。 GDP 线只是每日时间历史(无论其值如何),而衰退数据具有以下结构(从 59 年 1 月 1 日到今天,两个变量 CGD 和 Recession 共享相同的每日频率):

    Date    Regime
1   1/1/59  Normal
2   2/1/59  Normal
3   3/1/59  Normal
4   4/1/59  Normal
5   5/1/59  Normal
6   6/1/59  Normal
...
    
14  2/1/60  Normal
15  3/1/60  Normal
16  4/1/60  Recession
17  5/1/60  Recession
18  6/1/60  Recession
19  7/1/60  Recession
20  8/1/60  Recession
21  9/1/60  Recession
22  10/1/60 Recession
23  11/1/60 Recession
24  12/1/60 Recession
25  1/1/61  Recession
26  2/1/61  Normal
27  3/1/61  Normal

只有衰退部分必须用那种浅色调绘制。

有人可以帮忙吗?

谢谢。路易吉

【问题讨论】:

  • 感谢您这么快。我不确定我是否可以使用它。看来您需要传递要填充的范围。在我的情况下,“衰退”随机出现在向量(长向量)中,但衰退期/宽度可能会有所不同。所以我不能要求填写特定范围..
  • 您创建了一个[[RecessionStart1, RecessionEnd1],...] 列表并循环遍历该列表?

标签: python-3.x matplotlib time-series


【解决方案1】:

BigBen 的评论很好地暗示了使用plt.axvspan。如您所述,您需要指定一个范围。特别是如果您有日期范围(并且如果每个日期只有一个值),您可以通过 (date, date+1day) 指定范围。

plt.axvspan(day, day + datetime.timedelta(days=1), color="grey", alpha=0.5)

这是一个完整的例子:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import random

regime_choices = ["Normal"]*9+["Recession"]

#create sample data and dataframe
datelist = pd.date_range(start="1959-01-01",end="1960-01-01").tolist()
df = pd.DataFrame(datelist, columns=["Date"])

regime = [random.choice(regime_choices) for i in range(len(datelist))]
df["Regime"] = regime


#plot command, save object in variable
plt.plot(df["Date"], np.arange(len(df)))

#filter out recession dates
recessions = df.loc[df["Regime"] == "Recession", 'Date']

#plot axvspan for every recession day
for day in recessions:
    plt.axvspan(day, day + datetime.timedelta(days=1), color="grey", alpha=0.5)
    
plt.show()

结果:

【讨论】:

  • 感谢您提供的示例。我现在明白了。我只有1个问题。当我使您的代码适应我的代码时,基本上只有最后 4 行代码在我使用 plt.axvspan 时出现以下错误:只能将 str (not "datetime.timedelta") 连接到 str..."recessions " 是熊猫系列,但 "day" 有一个类型 str
  • 抱歉回复晚了:由于您的日期不是日期时间格式,而是字符串格式,您需要先转换它们。一个简单的解决方案可能是datetime.strptime(day)pd.to_datetime(day),甚至是recessions 系列通过pd.to_datetime(recessions)
猜你喜欢
  • 1970-01-01
  • 2019-03-20
  • 2022-12-06
  • 2018-10-14
  • 2012-06-20
  • 2018-02-13
  • 2016-09-23
  • 2012-03-02
  • 2019-03-08
相关资源
最近更新 更多