2015-01-22 3 views
1

matplotlib에 이미지를 플로팅했지만 색상 막대의 레이블이 제대로 배치되지 않습니다. 색상 막대에 12 개의 클래스를 배치했지만 일부만 표시합니다. 나는 도움에 감사해야한다.Matplotlib 불연속 색상 막대 레이블이 올바르게 배치되지 않았습니다.

from PIL import Image 
from scipy import misc 
import scipy 
import pylab as pl 
import numpy as np 
from sklearn import svm 
from sklearn import neighbors 
import matplotlib.pyplot as plt 
import matplotlib as mpl 

def plotimage(labels,image,imname):#input - array of labels and image of 1..n classes 
cmap = mpl.colors.ListedColormap(['r', 'g', 'b', 'c','k','y','m','w','#FFFF00','#FF8C00','#FF8EFC','#962404'])#only 12 classes at present 
#need to create pallate and labels later out of this def 
bounds = [0,1, 2, 3,4, 5,6,7,8,9,10,11,12,13] 
norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 
img = plt.imshow(image, cmap=cmap) 
cbar = plt.colorbar(img, cmap=cmap) #norm=norm, boundaries=bounds, ticks=bounds 
cbar.ax.set_yticklabels(labels) 
plt.gcf().canvas.set_window_title("Classification") 
#imsave("expr1_im", image.reshape(image.shape[0]/256,256), cmap=cmap) 
#savefig(imname) 
plt.title(imname) 
plt.show() 

b_imgarray = np.loadtxt("PlotData2001_Solar/SVM2001PixelArray.csv", delimiter=',') 

labels = ['D','F','A','G','R','I','BS','ABG','W','BG','COAG','BSMIX'] 

a = np.reshape(b_imgarray, (1500,1500)) 
c = 'SVmimage' 
plotimage(labels,a,c) 

잘못 배치 된 바 범례의 이미지. 내가 볼 수 있듯이 'D'에서 'BSMIX'까지 12 개의 레이블을 정의했지만 최대 ABG까지 표시됩니다. Misplace label image

+0

아래 답변이 도움이 되었습니까? 어떤 진전이 있니? – plonser

+0

예 @plosner ... 도움 주셔서 감사합니다 .. 나는 그것을 조금 꼬 집었습니다. – Piyush

답변

2

imshow은 일반적으로 cmap의 범위를 이미지에 나타나는 값으로 제한합니다. 당신의 cmap를 사용 vminvmax의 모든 값을 사용할 수 imshow을 강제하기 위해 :

img = plt.imshow(image, cmap=cmap, vmin=0, vmax=13) 
0

덕분에 많이 @plosner을 ... 나는 조금 그것을을 쥐게하고는 ... 작동

def plotimage(labels,image,imname):#input - array of labels and image of 1..n classes 
 
    cmap = mpl.colors.ListedColormap(['r', 'g', 'b', 'c','y','k','#FFFF00','#00FF00','#ADBE34','#FF8C00','w','#FF8EFC','#00FFDD','#673E03','#ADEE12','m','#12ABDE','#22EEAB','#33DDEF'])#only 8 classes at present ,'#FF8EFC','#00FF00','#00FFDD''#962404' '#FF8EFC','#962404' 
 
    #need to create pallate and labels later out of this def 
 
    #cmap = mpl.colors.ListedColormap(['r', 'g', 'b', 'c','m','k','y','w','#7FFF00','#FF8C00','#FFFF00','#FE6D06','#6E6E6E','#04B4AE'])#only 8 classes at present ,'#FF8EFC','#00FF00','#00FFDD''#962404' '#FF8EFC','#962404' 
 
    bounds = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
 
    norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 
 
    print cmap.N 
 
    img = plt.imshow(image, cmap=cmap , vmin = 1, vmax =20) 
 
    cbar = plt.colorbar(img, cmap=cmap,norm=norm, boundaries=bounds, ticks=bounds) #norm=norm, boundaries=bounds, ticks=bounds 
 
    cbar.ax.set_yticklabels(labels) 
 
    plt.gcf().canvas.set_window_title("Classification") 
 
    #imsave("expr1_im", image.reshape(image.shape[0]/256,256), cmap=cmap) 
 
    #savefig(imname) 
 
    plt.title(imname) 
 
    plt.show()
이산 년 Colorbar 필드의 중심에서 레이블을 정렬하기 위해

1

, 당신은 (하위 단위를 피하기 위해) 틱의 고정 번호를 정의하고를 사용해야합니다.

예를 들어, 년 Colorbar에 표시하는 N 이산 수준이있는 경우 :

cbar = plt.colorbar(ticks=range(N)) 
plt.clim(-0.5, N - 0.5) 

그것은 오래된 질문이지만 정답을 찾기 위해 여전히 어려운, 그리고 위의 어느 것도 나를 위해 일하지 않는다.

관련 문제