【问题标题】:plotting PCA output in scatter plot whilst colouring according to to label python matplotlib在散点图中绘制 PCA 输出,同时根据标签 python matplotlib 着色
【发布时间】:2018-01-02 04:14:06
【问题描述】:

我刚刚完成了对 14 个变量的 PCA 分析,我选择将这些变量压缩为 2 个分量。

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]]

我想做以下事情:

  1. 在散点图上绘制每个观测值,PC1 (x) 是每个数组中的第一个值,PC2 (y) 是第二个值。

  2. 根据来自初始 pre-PCA 数据的相应标签类型(即 A=red、B=blue、C=green 等)为每个观察结果着色。

  3. 使用来自初始 PCA 前数据的观察名称(即 John、Peter、Sally 等)标记 SELECTED(不是所有)观察

非常感谢任何/所有这些问题的帮助。

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

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

我正在寻找类似的东西:

【问题讨论】:

  • 向我们展示一个带有标签的代表性数据集
  • 你的数组是二维的,所以你需要用两个索引来索引它。 a[:,0] 用于第一列,a[:,1] 用于第二列。除了它真的不清楚实际问题是什么。
  • 感谢欧内斯特,这解决了问题 1。关于 2 和 3 的任何想法?
  • 您是否在 Google 上搜索过“如何为 matplotlib 散点图着色”或“如何注释 matplotlib 图”?
  • 是的,但这不像引用颜色那么简单,因为我需要查看以前未转换的数据集来应用所述颜色。

标签: python matplotlib pca


【解决方案1】:

我认为您的问题现在非常清楚 - 感谢您的编辑!

您描述的情节可以这样创建。


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

# 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),以便标签很好地定位在标记旁边。

对于星形标记,请注意vminvmax 在使用数字颜色矢量时很重要,否则星形最终会出现错误的颜色。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2012-08-06
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多