Распространение пользовательских меток равномерно по цветовой полосе - PullRequest
1 голос
/ 29 января 2020

Я пытаюсь добавить собственную цветовую панель в мою тепловую карту, используя pyplot. Мой код выглядит примерно так:

c_map = mpl.colors.ListedColormap(['#c7e9b4','#7fcdbb','#ffffff','#41b6c4','#225ea8','#253494'])
sm = plt.cm.ScalarMappable(cmap=c_map)
cbar = plt.colorbar(sm, ticks=np.arange(6), label='Change in user population')
cbar.ax.set_yticklabels(['<=-6', '<= -1', '0', '<= 3', '<= 6', '7>='])

В настоящее время создается следующая цветовая полоса: Неправильная цветовая полоса

Как видно из изображения, только два из шести в нижней и верхней части панели отображаются метки. Однако, следуя методам, используемым другими, я ожидаю, что ticks=np.arange(6) равномерно распределяет шесть меток по цветовой шкале, прежде чем менять метки тиков на указанные строковые значения.

Я ищу быстрый и ... грязный способ исправить это, так как это единственная визуальная карта, которую мне нужно сделать. Я искал часы безуспешно, поэтому, пожалуйста, помогите начинающему программисту.

1 Ответ

1 голос
/ 29 января 2020

Оси для тиков находятся в диапазоне от 0 (внизу) до 1 (вверху). Разделив пространство равномерно на 6 частей, вы увидите нижнюю часть каждой цветовой области. Добавление половины этого будет приятно в центре. Следовательно, ticks=np.linspace(0,1,6,endpoint=False) + 1/12. Или, что эквивалентно, ticks=(np.arange(6)+1/2)/6.

Вы можете удалить линии галочек, установив их длину на ноль: cbar.ax.axes.tick_params(length=0).

Чтобы получить правильное значение less than or equal, имея метки в Формат TeX является опцией. Как в r'$\leq-6$'.

Некоторый демонстрационный код:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

c_map = mpl.colors.ListedColormap(['#c7e9b4','#7fcdbb','#ffffff','#41b6c4','#225ea8','#253494'])
sm = plt.cm.ScalarMappable(cmap=c_map)
cbar = plt.colorbar(sm, ticks=np.linspace(0, 1, 6, endpoint=False) + 1/12, label='Change in user population')
cbar.ax.set_yticklabels([r'$\leq-6$', r'$\geq-1$', '$0$', r'$\leq3$', r'$\leq6$', r'$\geq7$'])
cbar.ax.axes.tick_params(length=0)
plt.show()

example colorbar

...