在散点图中绘制PCA输出,同时根据标签python matplotlib着色
我刚刚完成了对14个变量的PCA分析,我选择将其浓缩成两个分量在散点图中绘制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
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]]
我想做以下工作:
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图”吗?是的,但这并不像引用颜色那么简单,因为我需要查看以前未转换的数据集来应用所述颜色。