2012-09-19 5 views
18

나는이 두 벡터 등 1,2,3와 같은 수준의 레이블 값을 하나 하나하기 matplotlib 색상 레이블

내가 빨간색으로 1 급에 속하는 모든 점을 플롯 싶습니다

, 파란색으로 2 등급으로, 3 등급으로 녹색으로. 어떻게해야합니까?

답변

16

는 2 차원 배열의 데이터를 가지고 있다고 가정하면,이 작업을해야합니다 :

import numpy 
import pylab 
xy = numpy.zeros((2, 1000)) 
xy[0] = range(1000) 
xy[1] = range(1000) 
colors = [int(i % 23) for i in xy[0]] 
pylab.scatter(xy[0], xy[1], c=colors) 
pylab.show() 

을 또한 색상은 색상 맵의 사용을 통해 표시되는 제어하는 ​​cmap 속성을 설정할 수 있습니다; 즉와 pylab.scatter 라인 교체 : 컬러 맵의 목록을 찾을 수

pylab.scatter(xy[0], xy[1], c=colors, cmap=pylab.cm.cool) 

을 허용 대답은 당신이 할당되어야하는 클래스 레이블을 지정할 수 있습니다 경우가 발견,하지만이 here

+0

사실 내 데이터에는 23 개의 레이블이 있습니다. 그래서 색상 벡터를 xy와 같은 벡터 길이의 목록 형태로 0에서 22까지 할당했습니다. 그러나 시퀀스 길이가 3 또는 4 여야한다는 오류가 나타납니다. – user1050325

+0

질문에 몇 가지 예제 코드와 오류 메시지를 추가 할 수 있습니까? 나는 여기에 배치 한 간단한 예제를 1000 포인트와 23 개의 레이블로 수정했습니다. – brentlance

+0

플롯 기능을 사용할 때 오류가 발생하지 않습니다. 불행히도 내 코드를 플롯 기능으로 덮어 썼기 때문에 오류를 복제 할 수 없었습니다. – user1050325

20

특정 색상이나 레이블을 사용하면 다음 작업을 수행 할 수 있습니다. 컬러 바를 사용하여 체조를 조금했는데 줄거리를 만드는 것이 멋진 한 줄 짜기로 줄어 들었습니다. 이것은 sklearn을 사용한 분류 결과를 플로팅 할 때 유용합니다. 각 레이블은 (x, y) 좌표와 일치합니다.

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 

N = 23 # Number of labels 

# setup the plot 
fig, ax = plt.subplots(1,1, figsize=(6,6)) 
# define the data 
x = np.random.rand(1000) 
y = np.random.rand(1000) 
tag = np.random.randint(0,N,1000) # Tag each point with a corresponding label  

# define the colormap 
cmap = plt.cm.jet 
# extract all colors from the .jet map 
cmaplist = [cmap(i) for i in range(cmap.N)] 
# create the new map 
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N) 

# define the bins and normalize 
bounds = np.linspace(0,N,N+1) 
norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 

# make the scatter 
scat = ax.scatter(x,y,c=tag,s=np.random.randint(100,500,N),cmap=cmap,  norm=norm) 
# create the colorbar 
cb = plt.colorbar(scat, spacing='proportional',ticks=bounds) 
cb.set_label('Custom cbar') 
ax.set_title('Discrete color mappings') 
plt.show() 

준다 : 다음 this 대답의 약간 수정 된 버전을 사용

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 

x = [4,8,12,16,1,4,9,16] 
y = [1,4,9,16,4,8,12,3] 
label = [0,1,2,3,0,1,2,3] 
colors = ['red','green','blue','purple'] 

fig = plt.figure(figsize=(8,8)) 
plt.scatter(x, y, c=label, cmap=matplotlib.colors.ListedColormap(colors)) 

cb = plt.colorbar() 
loc = np.arange(0,max(label),max(label)/float(len(colors))) 
cb.set_ticks(loc) 
cb.set_ticklabels(colors) 

Scatter plot color labels

하나는 N 컬러를 위해 상기를 일반화

enter image description here

+0

23 색으로 만들 수 있습니까? (OP가 말했듯이, 나도 마찬가지입니다.) 1k 무작위 포인트가 있습니까? 당신의 대답은 훌륭하고 그림에 대한 나의 업보트를 가지고 있지만 이것이 10 가지 이상의 수업에서 효과가 있는지 알고 싶습니다. –

+0

위의 수정 사항을 참조하십시오. – salomonvh

+0

대단히 감사합니다. –

4

간단한 해결책은 각 클래스에 색상을 지정하는 것입니다. 이렇게하면 각 색상이 각 클래스에 대해 어떻게 표시되는지 제어 할 수 있습니다. 예 :

arr1 = [1, 2, 3, 4, 5] 
arr2 = [2, 3, 3, 4, 4] 
labl = [0, 1, 1, 0, 0] 
color= ['red' if l == 0 else 'green' for l in labl] 
plt.scatter(arr1, arr2, color=color) 
관련 문제