2013-04-09 13 views
39

Vorrei creare una legenda della barra di colore per una mappa termica, in modo che le etichette si trovino al centro di ciascun colore discreto. Si prega di vedere l'esempio qui sotto (borrowed from here)matplotlib: barre dei colori e le relative etichette di testo

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

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

plt.show() 

che genera il seguente grafico: pmesh plot

Idealmente mi piacerebbe per generare un bar leggenda che ha i quattro colori e per ogni colore, un'etichetta il suo centro: 0,1,2,3,> 4

risposta

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

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

plt.show() 

Eri molto vicino. Una volta che hai un riferimento all'asse della barra dei colori, puoi fare sempre ciò che vuoi, incluso mettere le etichette di testo nel mezzo. Potresti voler giocare con la formattazione per renderla più visibile.

demo

+0

grazie! davvero apprezzato. – dimka

+0

Ho provato questo e funziona quasi. Per qualche motivo il nome dell'etichetta dell'asse "numero di contatti" è scomparso a causa della linea "cbar.ax.axis ('off')". un modo per mantenere l'etichetta? – dimka

+0

@dimka vedere le modifiche, basta cambiare i tick in modo leggermente diverso. Devi ancora modificare i caratteri per avere un aspetto migliore, ma lo lascio come esercizio per il lettore;) – tacaswell

Problemi correlati