mys*_*ier 4 python matplotlib pca
我刚刚完成了 14 个变量的 PCA 分析,我选择将其压缩为 2 个分量。
pca = PCA(n_components=2)
pca.fit(z)
a = pca.fit_transform(z)
Run Code Online (Sandbox Code Playgroud)
给出的输出格式为:
[[ -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]]
Run Code Online (Sandbox Code Playgroud)
我想做以下事情:
将每个观测值绘制在散点图上,其中 PC1 (x) 是每个数组中的第一个值,PC2 (y) 是第二个值。
根据初始 PCA 前数据中相应的标签类型(即 A=红色、B=蓝色、C=绿色等)对每个观察值进行着色。
使用初始 PCA 前数据中的观察名称(即 John、Peter、Sally 等)标记所选(而非全部)观察结果
对于任何/所有这些问题,我们非常感谢任何帮助。
值得注意的是,我尝试通过以下方式进行分散:
plt.scatter(a[1], a[2])
plt.show()
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用,因为我的 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
Run Code Online (Sandbox Code Playgroud)
我正在寻找类似的东西:
我认为您的问题现在非常清楚 - 感谢您的编辑!
以下是创建您所描述的情节的方法。
首先,让我们生成一些示例数据:
# 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))
Run Code Online (Sandbox Code Playgroud)
接下来我们进行PCA:
pca = PCA(n_components=2)
features_pca = pca.fit_transform(features)
Run Code Online (Sandbox Code Playgroud)
然后我们准备一个长度列表/数组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]
Run Code Online (Sandbox Code Playgroud)
...或者只是一个整数范围。
# 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]
Run Code Online (Sandbox Code Playgroud)
最后,是时候进行绘图了。
# 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()
Run Code Online (Sandbox Code Playgroud)
plt.scatter正如您所看到的,可以通过kwarg输入不同的颜色c。另外,我推荐,edgecolor=''因为这通常看起来更清晰。您可以alpha增加/减少透明度,这将使标记的点更加突出/不那么突出。
使用适当的 x 和 y 位置将标签简单地放置在绘图上plt.text,我在这里稍微调整一下(使用labelpad),以便标签很好地放置在标记旁边。
对于星形标记,请注意,如果您使用数字颜色矢量,vmin则 和vmax很重要,否则星形最终会出现错误的颜色。
这是结果(使用手动定义的颜色):
| 归档时间: |
|
| 查看次数: |
14343 次 |
| 最近记录: |