Я пытаюсь установить цвета столбцов в зависимости от того, находится ли данное значение y выше, ниже или в пределах доверительного интервала. Таким образом, если заданное значение y выше верхнего предела шкалы, цвет полосы должен быть темным, ниже темно-синим и постепенно переходить в цвета шкалы цветов. В настоящее время мой код выглядит следующим образом:
import pandas as pd
import numpy as np
%matplotlib notebook
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.cm import ScalarMappable
import matplotlib.colors as mcolors
mpl.get_backend()
np.random.seed(12345)
df = pd.DataFrame([np.random.normal(32000,200000,3650),
np.random.normal(43000,100000,3650),
np.random.normal(43500,140000,3650),
np.random.normal(48000,70000,3650)],
index=[1992,1993,1994,1995])
y = 100000
xlocs = [0, 1, 2, 3]
value = df.mean()
std = df.std()
topbarlimits = value + (2*std)
minbarlimits = value - (2*std)
#Set colors
clist = [(0, "darkslateblue"), (0.09, "mediumblue"), (0.18, "cornflowerblue"), (0.27, "deepskyblue"),
(0.36, "lightskyblue"),(0.55, "white"), (0.64, "salmon"), (0.73, "tomato"), (0.82, "indianred"),
(0.91, "firebrick"), (1, "darkred")]
color_values = [0, 0.27, 0.55, 1]
color_values = [x / max(color_values) for x in color_values]
cmap = mcolors.LinearSegmentedColormap.from_list("", clist)
CS = plt.contourf([xlocs, color_values],cmap=cmap, levels = np.linspace(0, 1, 12))
plt.axhline(y=y, zorder=0)
plt.bar(range(len(df.columns)), value+np.abs(df.values.min()), bottom=df.values.min(),
yerr=2*std, align='center', alpha=0.5, color=cmap(5000),capsize = 10)
cbar = plt.colorbar(CS, cmap=clist)
cbar.set_label('Color', rotation=270,labelpad=25)
plt.xticks(range(len(df.columns)), df.columns)
plt.ylabel('Distribution value')
plt.title('Assignment 3')
for i, v in enumerate(abs(value.astype(int))):
plt.text(xlocs[i] + 0.2, abs(v) + 0.2, str(v))