在执行PCA后,如何在Python中显示散点图?

在执行PCA后,如何在Python中显示散点图?,python,matplotlib,statistics,anaconda,data-science,Python,Matplotlib,Statistics,Anaconda,Data Science,我自己制作了一个随机数据,由一个包含18行5列的文本文件组成,其中包含所有整数条目 我成功地做了PCA,但现在卡住了。我不能画散点图。这是我的密码: f=open(r'<path>mydata.txt') print(f.read()) #reading from a file with open(r'<path>mydata.txt') as f: emp= [] for line in f: line = line.split() if line

我自己制作了一个随机数据,由一个包含18行5列的文本文件组成,其中包含所有整数条目

我成功地做了PCA,但现在卡住了。我不能画散点图。这是我的密码:

f=open(r'<path>mydata.txt')
print(f.read()) #reading from a file


with open(r'<path>mydata.txt') as f:
emp= []
for line in f:
    line = line.split() 
    if line:            
        line = [int(i) for i in line]
        emp.append(line)


from sklearn.decomposition import PCA
import pylab as pl
from itertools import cycle
X = emp
pca = PCA(n_components=3, whiten=True).fit(X)
X_pca = pca.transform(X) #regular PCA

这就是你想要的吗

import numpy as np
from matplotlib import pyplot as plt


data1 = [np.random.normal(0,0.1, 10), np.random.normal(0,0.1,10)]
data2 = [np.random.normal(1,0.2, 10), np.random.normal(2,0.3,10)]
data3 = [np.random.normal(-2,0.1, 10), np.random.normal(1,0.5,10)]


plt.scatter(data1[0],data1[1])
plt.scatter(data2[0],data2[1])
plt.scatter(data3[0],data3[1])

plt.show()
三个不同数据集的结果如下所示:

编辑

希望我现在能更好地理解你的问题。新代码如下:

import numpy as np
from matplotlib import pyplot as plt    

with open(r'mydata.txt') as f:
    emp= []
    for line in f:
        line = line.split() 
        if line:            
            line = [int(i) for i in line]
            emp.append(line)


from sklearn.decomposition import PCA
import pylab as pl
from itertools import cycle
X = emp
pca = PCA(n_components=3, whiten=True).fit(X)
X_pca = pca.transform(X) #regular PCA

jobs = ['A', 'B', 'C']
job_id = np.array([e[4] for e in emp])

fig, axes = plt.subplots(3,3, figsize=(5,5))

for row in range(axes.shape[0]):
    for col in range(axes.shape[1]):
        ax = axes[row,col]
        if row == col:
            ax.tick_params(
                axis='both',which='both',
                bottom='off',top='off',
                labelbottom='off',
                left='off',right='off',
                labelleft='off'
            )
            ax.text(0.5,0.5,jobs[row],horizontalalignment='center')
        else:
            ax.scatter(X_pca[:,row][job_id==0],X_pca[:,col][job_id==0],c='r')
            ax.scatter(X_pca[:,row][job_id==1],X_pca[:,col][job_id==1],c='g')
            ax.scatter(X_pca[:,row][job_id==2],X_pca[:,col][job_id==2],c='b')
fig.tight_layout()
plt.show()
我分别用id
0、1和2将作业命名为A、B和C。从
emp
的最后一行,我创建了一个
numpy
数组来保存这些索引。在重要的绘图命令中,我通过作业ID屏蔽数据。希望这有帮助

生成的绘图如下所示:

编辑2

如果您只需要一个图,其中X_pca的第一列和第二列相互关联,那么代码就变得简单得多:

import numpy as np
from matplotlib import pyplot as plt

with open(r'mydata.txt') as f:
    emp= []
    for line in f:
        line = line.split() 
        if line:            
            line = [int(i) for i in line]
            emp.append(line)


from sklearn.decomposition import PCA
import pylab as pl
from itertools import cycle
X = emp
pca = PCA(n_components=3, whiten=True).fit(X)
X_pca = pca.transform(X) #regular PCA

jobs = ['A', 'B', 'C']
job_id = np.array([e[4] for e in emp])

row = 0
col = 1

plt.scatter(X_pca[:,row][job_id==0],X_pca[:,col][job_id==0],c='r')
plt.scatter(X_pca[:,row][job_id==1],X_pca[:,col][job_id==1],c='g')
plt.scatter(X_pca[:,row][job_id==2],X_pca[:,col][job_id==2],c='b')

plt.show()
结果如下所示:


我强烈建议您阅读这些示例中使用的函数的文档。

根据您希望获得此()的评论,以下是如何使用sklearn库:

在本例中,我使用iris数据:

第1部分:仅绘制散点图

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from numpy import linalg as LA
import pandas as pd
from scipy import stats

iris = datasets.load_iris()
X = iris.data
y = iris.target
#In general a good idea is to scale the data
X = stats.zscore(X)

pca = PCA()
x_new = pca.fit_transform(X)

plt.scatter(x_new[:,0], x_new[:,1], c = y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
#Create the biplot function
def biplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]
    scalex = 1.0/(xs.max() - xs.min())
    scaley = 1.0/(ys.max() - ys.min())
    plt.scatter(xs * scalex,ys * scaley, c = y)
    for i in range(n):
        plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = 'r',alpha = 0.5)
        if labels is None:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = 'g', ha = 'center', va = 'center')
        else:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = 'g', ha = 'center', va = 'center')
plt.xlim(-1,1)
plt.ylim(-1,1)
plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()


#Call the function. Use only the 2 PCs.
biplot(x_new[:,0:2],np.transpose(pca.components_[0:2, :]))
plt.show()
结果1

第2部分:如果您想绘制著名的双地块

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from numpy import linalg as LA
import pandas as pd
from scipy import stats

iris = datasets.load_iris()
X = iris.data
y = iris.target
#In general a good idea is to scale the data
X = stats.zscore(X)

pca = PCA()
x_new = pca.fit_transform(X)

plt.scatter(x_new[:,0], x_new[:,1], c = y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
#Create the biplot function
def biplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]
    scalex = 1.0/(xs.max() - xs.min())
    scaley = 1.0/(ys.max() - ys.min())
    plt.scatter(xs * scalex,ys * scaley, c = y)
    for i in range(n):
        plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = 'r',alpha = 0.5)
        if labels is None:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = 'g', ha = 'center', va = 'center')
        else:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = 'g', ha = 'center', va = 'center')
plt.xlim(-1,1)
plt.ylim(-1,1)
plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()


#Call the function. Use only the 2 PCs.
biplot(x_new[:,0:2],np.transpose(pca.components_[0:2, :]))
plt.show()
结果2


为问题添加一些上下文,您试图用散点图显示什么,样本数据集中有哪些列,您编写了哪些代码来解决问题。样本数据中的最后一列表示一种类型,我已将数据分为三种类型。该数据与Fisher的Iris数据集相似,数据被篡改。我希望散布图显示不同类型,作为一个聚类。回答你的问题吗?@ PCA后的SkyNETE,因为我的数据现在减少到3个维度,我应该考虑哪些数组?因为,如果你能看到我上面的代码,数据已经被制作成一个列表。现在,我想在PCA之后做一个散点图,这样点就可以聚集了。数据类似于费希尔虹膜数据。所以你问我们,你如何在散点图中可视化你的数据的某些行/列(哪些是?),或者你问我们,你应该考虑哪些行/列?在第一种情况下,我们可以帮助你,在第二种情况下,你可能问错了地方。例如,有一个专门用于统计的StackExchange站点,名为。我可能无法正确表达我的问题。以下是我想要实现的目标。只是我的原始数据没有与之关联的属性,只有数字。这可以做到吗?我的数据中的列表示,例如,公司、技能、年龄、位置和工作类型。在进行PCA之后,我希望散点图将我的数据分为3种类型,每种类型都与一种作业相关。就像Fisher的iris数据一样,根据花卉种类将其分为3组。类似地,我的散点图应该根据工作类型0、1或2分为3组。好吧,现在我觉得自己很愚蠢(我不太懂统计)。我使用示例输入运行了您的代码,得到的
X\u pca
是一个3x4矩阵。您想要从
emp
中的原始数据生成散点图,还是从
X_pca
生成散点图?您想要的是一个散点图,还是一组类似的散点图?我是否假设正确,您显示的示例数据集是
emp
的内容?我想要x_pca的散点图。一个绘图就可以了,但如果你能帮我绘制一系列绘图,我将不胜感激。是的,我给出的示例数据是原始数据集的一个实例。Emp只是数据列表的列表。