webentwicklung-frage-antwort-db.com.de

matplotlib: Farbbalken und ihre Beschriftungen

Ich möchte eine colorbar -Legende für ein heatmap erstellen, sodass sich die Beschriftungen in der Mitte jeder einzelnen Farbe befinden. Beispiel von hier ausgeliehen :

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 plot

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

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

Sie waren sehr nah. Sobald Sie einen Verweis auf die Achse des Farbbalkens haben, können Sie tun, was immer Sie wollen, einschließlich des Einfügens von Textbeschriftungen in die Mitte. Möglicherweise möchten Sie mit der Formatierung spielen, um sie besser sichtbar zu machen.

demo

84
tacaswell

Um zu tacaswells Antwort hinzuzufügen, verfügt die Funktion colorbar() über eine optionale Eingabe cax, mit der Sie eine Achse übergeben können, auf der der Farbbalken gezeichnet werden soll. Wenn Sie diese Eingabe verwenden, können Sie eine Beschriftung direkt über diese Achse 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
1