A norm
используется для сопоставления диапазона чисел с диапазоном 0..1, необходимым для цветовой карты. Мы можем создать специальную норму, чтобы получить желаемый эффект.
Норма зависит от vmin, самого низкого индекса, и vmax, самого высокого индекса. vmin
будет отображаться в 0, а vmax в 1.
Выбор верхнего и нижнего цветов (каждый между 0 и 1), например, верхнего = 0,9, чтобы остановиться на светло-зеленых в бгр . И ниже = 0, чтобы получить все цвета вплоть до темно-синего.
Формула находит значения vmin и vmax, которые бы отображали индекс i=0
на lower_color и индекс i=num_colors-1
на upper_color. Формула следует из единственного линейного уравнения, которое отображает:
0
на lower_color
num_colors - 1
на upper_color
vmin
на 0
vmax
до 1
Вы найдете индекс цвета для значения i=0..num_colors-1
как norm(i)
и соответствующий цвет как cmap(norm(i))
.
import matplotlib.pyplot as plt
import matplotlib as mpl
cmap = plt.cm.get_cmap('brg')
# between 0 and 1, 0 for the leftmost color of the range, 1 for the rightmost, upper > lower
upper_color = 0.8
lower_color = 0.3
num_colors = 20 # len(self.data.columns)
factor = (num_colors - 1)/(upper_color - lower_color)
norm = mpl.colors.Normalize(vmin=-lower_color*factor, vmax=(1 - lower_color)*factor)
for i in range(num_colors):
plt.plot([0, 1], [0, i], c=cmap(norm(i)))
plt.show()
Пример с картой brg
и выбором цветов от 0,3 до 0,8, просто чтобы показать, как это работает. Для справки есть цветовая шкала с теми же ограничениями. И полная цветовая полоса для brg
.
Цветные полосы были сгенерированы следующим образом:
c_map_ax = plt.gcf().add_axes([0.84, 0.1, 0.02, 0.8])
mpl.colorbar.ColorbarBase(c_map_ax, cmap=cmap, orientation='vertical')
c_map_ax.axes.set_ylim(lower_color, upper_color)
c_map_ax2 = plt.gcf().add_axes([0.92, 0.1, 0.02, 0.8])
mpl.colorbar.ColorbarBase(c_map_ax2, cmap=cmap, orientation='vertical')
plt.subplots_adjust(right=0.8)