在pandas + matplotlib中用colorbar绘制时间序列

时间:2018-07-03 18:12:16

标签: python pandas matplotlib data-visualization

我正在尝试在此图表下方绘制一个颜色条,其中颜色取决于每个时间序列的开始时间: Partial cumulative returns plotted over 2 years

生成的用于创建图的代码是这样的:

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns
sns.set()

def partial_cum_returns(start, cum_returns):
    return cum_returns.loc[start:].div(cum_returns.loc[start])

index = pd.DatetimeIndex(pd.date_range('20170101', '20190101', freq='W'))
np.random.seed(5)
returns = pd.Series(np.exp(np.random.normal(loc=0, scale=0.05, size=len(index))), index=index)
cum_returns = returns.cumprod()
df = pd.DataFrame(index=index)
for date in index:
    df[date] = partial_cum_returns(date, cum_returns)

df.plot(legend=False, colormap='viridis');
plt.colorbar();

但是执行此错误时出现:

  

RuntimeError:未找到可用于颜色条创建的可映射。首先定义一个可映射对象,例如图像(带有imshow)或轮廓集(带有outlinef)。

我尝试以不同的方式添加颜色条,例如fig, ax = plt.figure()...,但是到目前为止,我无法使其工作。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:4)

第一点是您需要为颜色栏创建一个ScalarMappable。您需要定义颜色图,在您的情况下为'viridis',并指定颜色条所需的最大值和最小值。然后,因为它使用数字时间值,所以您要重新格式化它们。

import matplotlib.pyplot as plt
import pandas as pd

# Define your mappable for colorbar creation
sm = plt.cm.ScalarMappable(cmap='viridis', 
                           norm=plt.Normalize(vmin=df.index.min().value,
                                              vmax=df.index.max().value))
sm._A = []  

df.plot(legend=False, colormap='viridis', figsize=(12,7));

cbar = plt.colorbar(sm);
# Change the numeric ticks into ones that match the x-axis
cbar.ax.set_yticklabels(pd.to_datetime(cbar.get_ticks()).strftime(date_format='%b %Y'))

enter image description here