2013-04-09 124 views
39

我想爲熱圖創建一個顏色條圖例,使標籤位於每個離散顏色的中心。請參閱例如波紋管(borrowed from herematplotlib:顏色條及其文本標籤

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

產生以下情節: pmesh plot

理想情況下,我想生成具有四種色彩的傳奇人物欄和每個顏色,在標籤其中心:0,1,2,3,> 4

回答

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

你非常接近。一旦你有了一個顏色棒軸的參考,你可以做任何你想做的事情,包括把文本標籤放在中間。您可能想要使用格式來使其更加明顯。

demo

+0

謝謝!非常感謝。 – dimka 2013-04-10 18:05:07

+0

我試過了,它幾乎可以工作。出於某種原因,由於「cbar.ax.axis('off')」行,軸標籤名稱「聯繫人數量」消失。任何方式來保持標籤? – dimka 2013-04-10 20:55:17

+0

@dimka看到編輯,只需稍微不同地打開滴答。你仍然必須調整字體看起來更好,但我留給讀者的練習;) – tacaswell 2013-04-10 21:02:29