matplotlib: цветные полосы и их текстовые метки

Я хотел бы создать colorbar легенду для heatmap, чтобы метки находились в центре каждого отдельного цвета. Пример заимствован отсюда:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

#discrete color scheme
cMap = ListedColormap(['white', 'green', 'blue','red'])

#data
np.random.seed(42)
data = np.random.rand(4, 4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=cMap)

#legend
cbar = plt.colorbar(heatmap)
cbar.ax.set_yticklabels(['0','1','2','>3'])
cbar.set_label('# of contacts', rotation=270)

# put the major ticks at the middle of each cell
ax.set_xticks(np.arange(data.shape[1]) + 0.5, minor=False)
ax.set_yticks(np.arange(data.shape[0]) + 0.5, minor=False)
ax.invert_yaxis()

#labels
column_labels = list('ABCD')
row_labels = list('WXYZ')
ax.set_xticklabels(column_labels, minor=False)
ax.set_yticklabels(row_labels, minor=False)

plt.show()

Это генерирует следующий сюжет:

pmesh plot

В идеале я хотел бы создать полосу легенды, которая имеет четыре цвета и для каждого цвета метку в центре: 0,1,2,>3. Как этого добиться?


person dimka    schedule 09.04.2013    source источник


Ответы (3)


import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

#discrete color scheme
cMap = ListedColormap(['white', 'green', 'blue','red'])

#data
np.random.seed(42)
data = np.random.rand(4, 4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=cMap)

#legend
cbar = plt.colorbar(heatmap)

cbar.ax.get_yaxis().set_ticks([])
for j, lab in enumerate(['$0$','$1$','$2$','$>3$']):
    cbar.ax.text(.5, (2 * j + 1) / 8.0, lab, ha='center', va='center')
cbar.ax.get_yaxis().labelpad = 15
cbar.ax.set_ylabel('# of contacts', rotation=270)


# put the major ticks at the middle of each cell
ax.set_xticks(np.arange(data.shape[1]) + 0.5, minor=False)
ax.set_yticks(np.arange(data.shape[0]) + 0.5, minor=False)
ax.invert_yaxis()

#labels
column_labels = list('ABCD')
row_labels = list('WXYZ')
ax.set_xticklabels(column_labels, minor=False)
ax.set_yticklabels(row_labels, minor=False)

plt.show()

Вы были очень близки. Если у вас есть ссылка на ось цветовой полосы, вы можете делать с ней все, что захотите, включая размещение текстовых меток посередине. Возможно, вы захотите поиграть с форматированием, чтобы сделать его более заметным.

демонстрация

person tacaswell    schedule 09.04.2013

Чтобы добавить к ответу tacaswell, функция colorbar() имеет дополнительный вход cax, который можно использовать для передачи оси, на которой должна отображаться шкала палитры. быть нарисованным. Если вы используете этот ввод, вы можете напрямую установить метку, используя эту ось.

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig, ax = plt.subplots()
heatmap = ax.imshow(data)
divider = make_axes_locatable(ax)
cax = divider.append_axes('bottom', size='10%', pad=0.6)
cb = fig.colorbar(heatmap, cax=cax, orientation='horizontal')

cax.set_xlabel('data label')  # cax == cb.ax
person Steven C. Howell    schedule 24.07.2019
comment
Я думаю, это должно быть axes_grid1 вместо axes.grid1. - person rvf; 18.12.2019

Это заставит вас добавить метку и изменить отметку шкалы палитры и размер метки:

clb=plt.colorbar()
clb.ax.tick_params(labelsize=8) 
clb.ax.set_title('Your Label',fontsize=8)

Это также можно использовать, если у вас есть подслоты:

plt.tight_layout()
plt.subplots_adjust(bottom=0.05)
cax = plt.axes([0.1, 0, 0.8, 0.01]) #Left,bottom, length, width
clb=plt.colorbar(cax=cax,orientation="horizontal")
clb.ax.tick_params(labelsize=8) 
clb.ax.set_title('Your Label',fontsize=8)
person ASE    schedule 07.05.2021
comment
красивое и простое решение, спасибо! - person Adrian Tompkins; 10.05.2021