2012-09-19 230 views
18

我有两个矢量,其中一个值和一个与类标记像1,2,3等Matplotlib颜色标签

我想绘制属于1类红色的所有点,蓝色的2级,绿色的3级等。我该怎么做?

回答

16

假设你有一个二维数组数据,这应该工作:

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个这样的标签。所以,我将颜色矢量分配为从0到22的列表形式,其矢量长度与xy相同。但是,我得到一个错误,说序列长度必须是3或4. – user1050325

+0

您可以添加一些示例代码和错误消息到您的问题?我修改了我放在这里的一个简单例子,它有一千个点和23个标签。 – brentlance

+0

虽然我使用绘图功能时没有出现错误。不幸的是我用plot函数覆盖了我的代码,因此无法复制错误。 – user1050325

20

接受的答案有它发现的,但如果你可能要指定哪些类别标签应分配给一个特定的颜色或标签,你可以做到以下几点。我用彩条做了一个小标签体操,但是让情节本身减少到一个很好的单线。这适用于绘制sklearn的分类结果。每个标签匹配(x,y)坐标。

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

使用this答案的一个略加修改的版本,一个可以概括上述用于N种颜色如下:

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

其中给出:

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)