我正在尝试在此图表下方绘制一个颜色条,其中颜色取决于每个时间序列的开始时间:
生成的用于创建图的代码是这样的:
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()...
,但是到目前为止,我无法使其工作。有任何想法吗?谢谢!
答案 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'))