在散点图中绘制PCA输出,同时根据标签python matplotlib着色

在散点图中绘制PCA输出,同时根据标签python matplotlib着色,python,matplotlib,pca,Python,Matplotlib,Pca,我刚刚完成了对14个变量的PCA分析,我选择将其浓缩成两个分量 pca = PCA(n_components=2) pca.fit(z) a = pca.fit_transform(z) 其输出形式如下: [[ -3.84514275e+00 -1.19829226e-01] [ -4.78476227e+00 -1.35986090e-01] [ -2.26702900e+00 -1.19665853e+00] [ -5.01021616e+00 2.76005130e+00

我刚刚完成了对14个变量的PCA分析,我选择将其浓缩成两个分量

pca = PCA(n_components=2)
pca.fit(z)
a = pca.fit_transform(z)
其输出形式如下:

[[ -3.84514275e+00  -1.19829226e-01]
 [ -4.78476227e+00  -1.35986090e-01]
 [ -2.26702900e+00  -1.19665853e+00]
 [ -5.01021616e+00   2.76005130e+00]
 [ -5.57580326e+00  -2.00656680e+00]
 [ -5.08184415e+00  -3.68721491e+00]
 [ -3.41505366e+00  -7.61184868e-01]
 [ -4.92439159e+00  -1.82147509e+00]
...
 [ -3.34931300e+00   7.57884906e-01]]
我想做以下工作:

  • 在散射图上绘制每个观测值,PC1(x)为每个阵列中的第一个值,PC2(y)为第二个值

  • 根据初始PCA前数据中相应的标签类型(即A=红色,B=蓝色,C=绿色等)给每个观察结果上色

  • 使用初始PCA前数据(即John、Peter、Sally等)中的观察名称标记所选(并非所有)观察结果

  • 对于任何/所有这些问题,我们都非常感谢您的帮助

    值得注意的是,我试图通过以下方式进行分散:

    plt.scatter(a[1], a[2])
    plt.show()
    
    但很明显,这不起作用,因为我的a输出没有用逗号分隔,只能画2个点。我无法控制自己的想法,因此非常感谢so的意见

    编辑:

    数据集格式为:

    John, A, var1, var2, var3, ..., var14
    Peter, A, var1, var2, var3, ..., var14
    Sally, B, var1, var2, var3, ..., var14
    Cath, C, var1, var2, var3, ..., var14
    Jim, A, var1, var2, var3, ..., var14
    
    我想要的是类似的东西:


    我想你的问题现在已经很清楚了-谢谢你的编辑

    下面是如何创建您描述的绘图


    首先,让我们生成一些示例数据:

    # Params
    n_samples  = 100
    m_features =  14
    selected_names = ['name_13', 'name_23', 'name_42', 'name_66']
    
    # Generate
    np.random.seed(42)
    names    = ['name_%i' % i for i in range(n_samples)]
    labels   = [np.random.choice(['A','B','C','D']) for i in range(n_samples)]
    features = np.random.random((n_samples,m_features))
    
    接下来我们进行PCA:

    pca = PCA(n_components=2)
    features_pca = pca.fit_transform(features)
    
    然后我们准备一个长度
    n
    的列表/数组,将标签
    a、B、C、…
    转换为颜色。这些可以是手工选择的颜色

    # Label to color dict (manual)
    label_color_dict = {'A':'red','B':'green','C':'blue','D':'magenta'}
    
    # Color vector creation
    cvec = [label_color_dict[label] for label in labels]
    
    …或只是一系列整数

    # Label to color dict (automatic)
    label_color_dict = {label:idx for idx,label in enumerate(np.unique(labels))}
    
    # Color vector creation
    cvec = [label_color_dict[label] for label in labels]
    
    最后,是时候策划了

    # Create the scatter plot
    plt.figure(figsize=(8,8))
    plt.scatter(features_pca[:,0], features_pca[:,1],
                c=cvec, edgecolor='', alpha=0.5)
    
    # Add the labels
    for name in selected_names:
    
        # Get the index of the name
        i = names.index(name)
    
        # Add the text label
        labelpad = 0.01   # Adjust this based on your dataset
        plt.text(features_pca[i,0]+labelpad, features_pca[i,1]+labelpad, name, fontsize=9)
    
        # Mark the labeled observations with a star marker
        plt.scatter(features_pca[i,0], features_pca[i,1],
                    c=cvec[i], vmin=min(cvec), vmax=max(cvec),
                    edgecolor='', marker='*', s=100)
    
    # Add the axis labels
    plt.xlabel('PC 1 (%.2f%%)' % (pca.explained_variance_ratio_[0]*100))
    plt.ylabel('PC 2 (%.2f%%)' % (pca.explained_variance_ratio_[1]*100)) 
    
    # Done
    plt.show()
    
    如您所见,不同的颜色可以通过
    c
    kwarg输入
    plt.scatter
    。此外,我建议使用
    edgecolor='
    ,因为这样看起来更清晰。您可以使用
    alpha
    来增加/减少透明度,这将使标记的点更加突出/不那么突出

    标签只需使用
    plt.text
    和适当的x和y位置放置在绘图上,我在这里稍微调整了一下(使用
    labelpad
    ),以便标签很好地定位在标记旁边

    对于星号标记,请注意,如果使用数字颜色向量,则
    vmin
    vmax
    非常重要,否则星号将以错误的颜色结束

    以下是结果(使用手动定义的颜色):


    向我们展示一个具有代表性的数据集,带有标签。您的数组是二维的,因此需要使用两个索引对其进行索引<第一列代码>a[:,0],第二列代码>a[:,1]。除此之外,真正的问题是什么还不清楚。谢谢欧内斯特,这解决了问题1。关于2和3有什么想法吗?你用谷歌搜索过“如何给matplotlib散点图着色”或“如何注释matplotlib图”吗?是的,但这并不像引用颜色那么简单,因为我需要查看以前未转换的数据集来应用所述颜色。