Written and maintained by CASRAI Editorial Board
Last updated
A principal component analysis (PCA) plot shows each observation at its coordinates (scores) on the first principal components, usually PC1 on the x-axis and PC2 on the y-axis, so that the main pattern in many correlated variables can be seen in two dimensions. This guide is for researchers and analysts who have a PCA plot in front of them and need to read it correctly, build one, and report it.
What is a PCA plot? (PCA in a simple way)
PCA replaces many correlated variables with a smaller number of derived, uncorrelated variables, called principal components, that preserve as much of the original variability as possible (Jolliffe & Cadima, 2016). The components are ordered: PC1 is the direction along which the data vary most, PC2 is the direction of greatest remaining variation at right angles to PC1, and so on. A PCA plot draws the data using those directions as axes instead of the original variables.
Several different charts are called a “PCA plot”, and they answer different questions:
| Plot | What each point or arrow is | What it tells you |
|---|---|---|
| Score plot | One point per observation (individual, sample), at its PC scores | Which observations are similar, which form groups, which are outliers. Points near the origin are near the sample mean. |
| Loadings plot | One point or arrow per original variable, at its loadings on two components | Which variables drive each component and in which direction. |
| Biplot | Observations as points and variables as vectors, on the same axes | Both at once: the angle between two variable vectors reflects their correlation, and the projection of a point onto a variable vector indicates its relative value on that variable (Jolliffe & Cadima, 2016). |
| Scree plot | Variance (eigenvalue) of each component | How many components are worth keeping. See what a scree plot is. |
What are PC1 and PC2 in a PCA plot?
PC1 and PC2 are the first two principal components: linear combinations of the centred variables whose coefficients, the loadings, are chosen so that PC1 has the largest possible variance and PC2 has the largest variance among combinations uncorrelated with PC1. Each point’s coordinate on PC1 is its score, obtained by applying the loadings to that observation’s centred data.
The share of total variance a component carries is its eigenvalue divided by the trace of the covariance matrix (the sum of all eigenvalues). Good plots print these percentages in the axis labels, for example “PC1 (99.2%)”. Jolliffe and Cadima’s fossil-teeth example (9 measurements on 88 teeth) shows how loadings are named: on PC1 every loading has the same sign, which they read as overall size, while PC2 contrasts length measurements with height and width measurements, which they read as shape. PC1 and PC2 together carry about 95% of the variance there.
Formula: how the scores are computed
Let X be the n × p data matrix and X* the same matrix with each column centred on its mean. The sample covariance matrix is S = X*′X*/(n − 1) (see covariance matrix). The variance of a linear combination Xa is a′Sa, subject to a′a = 1. Maximising it gives Sa = λa, so each loading vector a is an eigenvector of S and its eigenvalue λ is the variance of that component. Collecting the loading vectors as columns of A, the score matrix is X*A, and the proportion of variance explained by component k is λk / tr(S) (Jolliffe & Cadima, 2016).
Worked example with the arithmetic shown
Take six observations of two variables, the data used in the scikit-learn PCA documentation: (−1, −1), (−2, −1), (−3, −2), (1, 1), (2, 1), (3, 2).
- Centre. The mean of x is (−1−2−3+1+2+3)/6 = 0 and the mean of y is (−1−1−2+1+1+2)/6 = 0, so the data are already centred.
- Covariance matrix. Var(x) = (1+4+9+1+4+9)/5 = 5.6. Var(y) = (1+1+4+1+1+4)/5 = 2.4. Cov(x, y) = (1+2+6+1+2+6)/5 = 3.6. So S = [[5.6, 3.6], [3.6, 2.4]] and tr(S) = 8.
- Eigenvalues. They solve λ² − 8λ + (5.6 × 2.4 − 3.6²) = λ² − 8λ + 0.48 = 0, giving λ1 = (8 + √62.08)/2 ≈ 7.940 and λ2 ≈ 0.060.
- Variance explained. PC1: 7.940/8 ≈ 99.2%. PC2: 0.060/8 ≈ 0.8%. These match the explained-variance ratios of 0.9924 and 0.0075 in the scikit-learn documentation.
- Loadings. The unit eigenvectors are approximately PC1 = (0.838, 0.545) and PC2 = (−0.545, 0.838). Both loadings on PC1 are positive, so PC1 is a weighted “overall size” axis of x and y.
- Scores. For (−1, −1): PC1 = 0.838(−1) + 0.545(−1) = −1.383; PC2 = −0.545(−1) + 0.838(−1) = −0.293.
| Observation (x, y) | PC1 score | PC2 score |
|---|---|---|
| (−1, −1) | −1.383 | −0.293 |
| (−2, −1) | −2.222 | 0.251 |
| (−3, −2) | −3.605 | −0.042 |
| (1, 1) | 1.383 | 0.293 |
| (2, 1) | 2.222 | −0.251 |
| (3, 2) | 3.605 | 0.042 |
Plotted, the six points lie almost on a horizontal line: they spread from −3.6 to +3.6 along PC1 and by less than 0.3 along PC2. That is what a 99.2% / 0.8% split looks like. The two groups of three points sit on opposite sides of the origin, which is the mean.
How to interpret a PCA score plot
Read the axis labels first, then the points. Use this guide:
| What you see | How to read it |
|---|---|
| Percentages in axis labels | Share of total variance carried by that component. The plot is a faithful summary only to the extent that PC1 and PC2 together account for most of the variance. |
| Points close together | Observations with similar values on the variables the components summarise. |
| Separated clusters | Groups that differ along the plotted components. Clusters seen by eye are a prompt for further analysis (for example k-means clustering), not a test. |
| A point far from the rest | A possible outlier on the plotted components; check the raw data. |
| A point near the origin | An observation near the mean of all variables. |
| Biplot: two variable vectors at a small angle | The angle between vectors reflects the correlation of the variables: a small angle suggests positive correlation, opposite directions suggest negative correlation. |
| Biplot: a point lies far along a variable vector | The observation has a high relative value of that variable. |
Assumptions and common mistakes
- Scaling. scikit-learn centres the data but does not scale each feature; R’s
prcompdefaults toscale. = FALSEand its manual says scaling is in general advisable. With variables in different units, unscaled PCA lets the largest-variance variable dominate PC1. - Signs are arbitrary. The signs of all loadings and scores can be flipped without changing the analysis (Jolliffe & Cadima, 2016). Two programs can draw mirror-image plots of the same data.
- Low variance on PC1 and PC2. If the two plotted components carry a small share of the variance, distances in the plot misrepresent distances in the data. Check the scree plot and report the percentages.
- Components are not causes. A principal component is a weighted combination of the variables, not a measured group. For a latent-variable model see exploratory factor analysis.
- Linear structure only. PCA summarises variance and covariance of the variables; it is not designed to reveal nonlinear structure.
How to report a PCA plot (APA example)
State the data matrix, whether variables were standardised, the number of components kept and the variance explained. Template wording (adapt to your study; the bracketed values are placeholders):
We performed a principal component analysis on the correlation matrix of [p] standardised variables (N = [n]). The first two components accounted for [x]% of the total variance (Figure 1). PC1 had positive loadings on all variables; PC2 contrasted [group A] with [group B].
Label the axes with the percentage of variance, say whether biplot arrows were scaled, and cite the software and version.
How to make a PCA plot in R, Python or Excel
R
p <- prcomp(USArrests, scale. = TRUE)
summary(p) # proportion of variance per PC
biplot(p) # observations and variable vectors
plot(p$x[, 1], p$x[, 2], xlab = "PC1", ylab = "PC2") # score plot
prcomp returns sdev, rotation (loadings) and x (scores). More in PCA in R.
Python
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
X = np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])
pca = PCA(n_components=2)
scores = pca.fit_transform(X)
print(pca.explained_variance_ratio_) # [0.9924 0.0075]
plt.scatter(scores[:, 0], scores[:, 1])
plt.xlabel("PC1"); plt.ylabel("PC2"); plt.show()
The sign of each score column may differ from the table above. See PCA in Python.
Excel
Excel has no built-in PCA function. For two variables in A2:A7 and B2:B7 build the covariance matrix with =VAR.S(A2:A7), =VAR.S(B2:B7) and =COVARIANCE.S(A2:A7,B2:B7), get the larger eigenvalue from =(a+d)/2+SQRT(((a-d)/2)^2+b^2) (a and d the variances, b the covariance; 7.940 for the example), and chart scores with a scatter chart. For more than two variables use R, Python or an add-in.
FAQ
How do you interpret a PCA score plot?
Read the percentages on the axes, then look for clusters, gradients and outliers among the points; points close together are similar on the variables the components summarise. Use the loadings or a biplot to see which variables produce a given direction.
What is PCA for dummies?
PCA finds new axes through your data that capture the most variation and re-plots the data on the first few of them, so a table with many columns can be viewed on a flat chart.
What are PC1 and PC2?
PC1 is the direction of greatest variance in the data; PC2 is the direction of greatest remaining variance at right angles to PC1.
Why does my PCA plot look flipped compared with another program?
The signs of loadings and scores are arbitrary, so a mirror image is the same result.
Sources
- Jolliffe, I. T., & Cadima, J. (2016). Principal component analysis: a review and recent developments. Philosophical Transactions of the Royal Society A, 374(2065), 20150202. https://pmc.ncbi.nlm.nih.gov/articles/PMC4792409/ (read 2026-11-07).
- scikit-learn documentation, sklearn.decomposition.PCA. https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html (read 2026-11-07).
- R Core Team, prcomp manual page, R stats package. https://stat.ethz.ch/R-manual/R-devel/library/stats/html/prcomp.html (read 2026-11-07).







