matplotlib使用非顺序标签颜色进行分散

时间:2016-05-09 21:55:07

标签: python matplotlib plot

我正在尝试使用基于标签向量y(大小为3)的颜色绘制散点图。标签来自{0,1,5}集。但是下面的代码没有给我预期的情节。颜色未正确绘制。而不是黄色,黑色被绘制,并且没有红色仅绘制为蓝色(也是黑色更大的点)。

from sklearn.datasets.samples_generator import make_blobs;
import numpy as np;
import matplotlib.pyplot as plt;
import matplotlib.colors as clrs;

X,y = make_blobs(n_samples=100, n_features = 2, centers = 5,  cluster_std = 4.8, random_state=1000);
tr_sz = 40;
y = np.ones(y.shape,dtype=np.uint8);
y[tr_sz:] = 0;
ind1 = np.random.choice(tr_sz,size=12);
y[ind1] = 5
colors = ['yellow', 'red', 'blue'];
fig, ax1 = plt.subplots(figsize=(3.25,3));
print y;
ax1.scatter(X[:,0],X[:,1], s=y+1, c=y,     cmap=clrs.ListedColormap(colors));
fig.savefig('test.pdf');

1 个答案:

答案 0 :(得分:0)

你有几个问题

  1. 您的色彩映射表将从您的列表中创建,因此无法知道1应该映射到red - 它只是映射数据的max( 5)到bluemin(0)为黄色,其余为插值,因此1也会映射为黄色。如果您在数据中将1替换为3(例如,使用行y = np.array([k if k!=1 else 3 for k in y ])),则会看到红色。

  2. 您的积分非常小 - 特别是y==0(您的标记半径仅为1)的情况。在这种情况下,标记周围的线是您看到的,而不是填充颜色。你认为你看到黑色的地方 - 你的标记实际上是黄色的,只有 非常 小。解决这个问题的方法就是将大小乘以一个常数因子。

  3. 解决方案

    这是实现我认为你想要的一种方式(替换样品的第12-15行):

    colors = {0:'yellow', 1:'red', 5:'blue'};
    fig, ax1 = plt.subplots(figsize=(3.25,3));
    print y;
    c_arr=[colors[k] for k in y]
    ax1.scatter(X[:,0],X[:,1], s=(y+1)*20, c=c_arr);
    

    输出

    scatter plot output