matplotlib: colorbars dan label teksnya

108

Saya ingin membuat colorbarlegenda untuk a heatmap, sehingga label berada di tengah setiap warna diskrit. Contoh yang dipinjam dari sini :

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()

Ini menghasilkan plot berikut:

plot pmesh

Idealnya saya ingin menghasilkan bar legenda yang memiliki empat warna dan untuk setiap warna, label di tengahnya: 0,1,2,>3. Bagaimana ini bisa dicapai?

dimka
sumber

Jawaban:

114
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()

Anda sangat dekat. Setelah Anda memiliki referensi ke sumbu bilah warna, Anda dapat melakukan apa pun yang Anda inginkan, termasuk meletakkan label teks di tengah. Anda mungkin ingin bermain-main dengan pemformatan agar lebih terlihat.

demo

tacaswell.dll
sumber
6

Untuk menambah jawaban tacaswell , colorbar()fungsi tersebut memiliki caxinput opsional yang dapat Anda gunakan untuk melewatkan sumbu di mana bilah warna harus digambar. Jika Anda menggunakan input itu, Anda dapat langsung mengatur label menggunakan sumbu itu.

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
Steven C. Howell
sumber
1
Saya pikir itu harus axes_grid1bukan axes.grid1.
rvf