matplotlib: Farbleisten und ihre Textbeschriftungen

107

Ich möchte eine colorbarLegende für a erstellen heatmap, sodass sich die Beschriftungen in der Mitte jeder einzelnen Farbe befinden. Beispiel von hier entlehnt :

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

Dies erzeugt das folgende Diagramm:

pmesh Handlung

Idealerweise möchte ich eine Legendenleiste mit den vier Farben und für jede Farbe ein Etikett in der Mitte erstellen : 0,1,2,>3. Wie kann dies erreicht werden?

dimka
quelle

Antworten:

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

Du warst sehr nah. Sobald Sie einen Verweis auf die Farbleistenachse haben, können Sie tun, was immer Sie wollen, einschließlich der Platzierung von Textbeschriftungen in der Mitte. Möglicherweise möchten Sie mit der Formatierung spielen, um sie besser sichtbar zu machen.

Demo

Tacaswell
quelle
6

Um die Antwort von Tacaswell zu ergänzen, verfügt die colorbar()Funktion über eine optionale caxEingabe, mit der Sie eine Achse übergeben können, auf der der Farbbalken gezeichnet werden soll. Wenn Sie diese Eingabe verwenden, können Sie mit dieser Achse direkt eine Beschriftung festlegen.

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
quelle
1
Ich denke es sollte axes_grid1statt sein axes.grid1.
RVF