Seaborn axvspan() 两条线之间的阴影

时间:2021-07-11 01:04:48

标签: python pandas matplotlib seaborn pandas-datareader

我无法使用 seaborn 和 pandas 数据框对两个日期之间的区域进行着色。代码如下。我怎样才能做到这一点。我无法循环该功能。我不知道如何循环它。

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas_datareader.data as pdr 
import pandas as pd 
import datetime
import matplotlib.dates as mdates

start = datetime.datetime (2000,1,1)
end = datetime.datetime (2020,12,31)
df =  pdr.DataReader(['FEDFUNDS','TERMCBPER24NS','TERMCBCCALLNS','T5YIFR','T10YIE'], 'fred', start, end)
df.columns = ['Effective Federal Funds Rate','Finance Rate on Personal Loans at Commercial Banks','Commercial Bank Interest Rate on Credit Card Plans',
         '5-Year, 5-Year Forward Inflation Expectation Rate','10-Year Breakeven Inflation Rate']

fig, axes = plt.subplots(5,1, figsize=(20,25))
for ax, col in zip(axes, df.columns):
ax.axvspan(mdates.date2num(datetime.datetime(2007,1,12)), mdates.date2num(datetime.datetime(2009,6,1)), color='teal', alpha=0.5,
           label='2008 Crisis')
ax.axvspan(mdates.date2num(datetime.datetime(2019,12,1)), mdates.date2num(datetime.datetime(2020,2,1)), color='orange', alpha=0.5,
           label='Pandemic')
ax.set_title(col)

axes[0].set_title('Effective Federal Funds Rate')
sns.scatterplot(x='DATE', y='Effective Federal Funds Rate',  data=df,  s=50, ax=axes[0])
axes[1].set_title('Finance Rate on Personal Loans at Commercial Banks')
sns.scatterplot(x='DATE', y='Finance Rate on Personal Loans at Commercial Banks',  data=df, s=50,ax=axes[1])
axes[2].set_title('Commercial Bank Interest Rate on Credit Card Plan')
sns.scatterplot(x='DATE', y='Commercial Bank Interest Rate on Credit Card Plans',  data=df,  s=50, ax=axes[2]) 
axes[3].set_title('5-Year, 5-Year Forward Inflation Expectation Rate')
sns.scatterplot(x='DATE', y='5-Year, 5-Year Forward Inflation Expectation Rate', data=df,  s=50, ax=axes[3])
axes[4].set_title('10-Year Breakeven Inflation Rate')
sns.scatterplot(x='DATE', y='10-Year Breakeven Inflation Rate',  data=df,  s=50, ax=axes[4])

plt.tight_layout
plt.style.use('seaborn-whitegrid')

1 个答案:

答案 0 :(得分:0)

我认为您上一个问题的答案启用了 axvspan,因为它会自动转换为 Pandas 图中的时间序列。如果此代码仅包含 matplotlib,则您将需要转换时间序列数据。见this

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas_datareader.data as pdr 
import pandas as pd 
import datetime
import matplotlib.dates as mdates

start = datetime.datetime (2000,1,1)
end = datetime.datetime (2020,12,31)
df = pdr.DataReader(['FEDFUNDS','TERMCBPER24NS','TERMCBCCALLNS','T5YIFR','T10YIE'], 'fred', start, end)
df.columns = ['Effective Federal Funds Rate','Finance Rate on Personal Loans at Commercial Banks','Commercial Bank Interest Rate on Credit Card Plans',
             '5-Year, 5-Year Forward Inflation Expectation Rate','10-Year Breakeven Inflation Rate']

fig, axes = plt.subplots(5,1, figsize=(20,25))
for ax, col in zip(axes, df.columns):
    ax.axvspan(mdates.date2num(datetime.datetime(2007,1,12)), mdates.date2num(datetime.datetime(2009,6,1)), color='teal', alpha=0.5,
               label='2008 Crisis')
    ax.axvspan(mdates.date2num(datetime.datetime(2019,12,1)), mdates.date2num(datetime.datetime(2020,2,1)), color='orange', alpha=0.5,
               label='Pandemic')
    ax.set_title(col)

axes[0].set_title('Effective Federal Funds Rate')
sns.scatterplot(x='DATE', y='Effective Federal Funds Rate',  data=df,  s=50, ax=axes[0])
axes[1].set_title('Finance Rate on Personal Loans at Commercial Banks')
sns.scatterplot(x='DATE', y='Finance Rate on Personal Loans at Commercial Banks',  data=df, s=50,ax=axes[1])
axes[2].set_title('Commercial Bank Interest Rate on Credit Card Plan')
sns.scatterplot(x='DATE', y='Commercial Bank Interest Rate on Credit Card Plans',  data=df,  s=50, ax=axes[2]) 
axes[3].set_title('5-Year, 5-Year Forward Inflation Expectation Rate')
sns.scatterplot(x='DATE', y='5-Year, 5-Year Forward Inflation Expectation Rate', data=df,  s=50, ax=axes[3])
axes[4].set_title('10-Year Breakeven Inflation Rate')
sns.scatterplot(x='DATE', y='10-Year Breakeven Inflation Rate',  data=df,  s=50, ax=axes[4])

plt.tight_layout
plt.style.use('seaborn-whitegrid')

enter image description here