The following is a very brief explanation of how the PCA rotates data to maximise its variance along orthogonal axes. It intentionally does not touch on the dimensionality reduction aspect.
First we create a small plotting helper that we can reuse with new data; we’ll use coord_fixed to better illustrate the variability across the two dimensions.
plot = function (data) {
data = data %>%
as.data.frame() %>%
mutate(Species = iris$Species)
cols = as.list(setNames(colnames(data), c('x', 'y', 'color')))
ggplot(data, do.call(aes_string, cols)) + geom_point() + coord_fixed()
}
To see the data before its transformation, let’s plot the original iris distribution of petal width and length:
(petal_data = select(iris, Petal.Width, Petal.Length))
plot(petal_data)

Now rotate the data by performing PCA:
pca = prcomp(petal_data)
(rotated_petals = as.data.frame(pca$x))
And plot the rotated data:
plot(rotated_petals)

The prcomp function also gives us the rotation matrix \(r\) of the PCA, which is a matrix of the rotation’s eigenvectors:
pca$rotation
PC1 PC2
Petal.Width 0.3877188 -0.9217777
Petal.Length 0.9217777 0.3877188
(Incidentally, this corresponds to a rotation angle \(\theta = {\mathop{\rm acos}r_{11}} \approx 67°\).)
We can apply the rotation ourselves via simple matrix multiplication:
rotated_petals2 = as.matrix(petal_data) %*% pca$rotation
plot(rotated_petals2)

Note that this figure looks almost identical to rotated_petals; the only difference is the \(x\)- and \(y\)-axis labelling: by default, prcomp centers the data before rotation; If we wanted to do the same, we’d have to column-wise subtract pca$center from our rotated data (which is identical to colMeans(petal_data)).
Finally we can visualise the rotations’ eigenvectors and eigenvalues (which are both factors of the loadings) in a so-called biplot. pca$sdev, the rotation’s standard deviation, is the square root of the eigenvalues; we therefore get:
(loadings = sweep(pca$rotation, 2, pca$sdev, `*`))
PC1 PC2
Petal.Width 0.7418752 -0.17500689
Petal.Length 1.7637628 0.07361153
A biplot is the PCA plot augmented by arrows corresponding to the loadings:
plot(rotated_petals) + arrows(loadings)

If, instead, we plot the eigenvectors directly, we can see immediately how the data has been rotated from its original form into the PCA:
plot(rotated_petals) + arrows(pca$rotation)

The arrows do indeed correspond to the original (centred) axes of the iris petal data, and the plot’s clockwise tilt by \(67°\) becomes apparent.
LS0tCnRpdGxlOiAiUENBIG9mIGBpcmlzYCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogbm9uZQogICAgdGhlbWU6IGNvc21vCi0tLQoKVGhlIGZvbGxvd2luZyBpcyBhIHZlcnkgYnJpZWYgZXhwbGFuYXRpb24gb2YgaG93IHRoZSBQQ0Egcm90YXRlcyBkYXRhIHRvIG1heGltaXNlIGl0cyB2YXJpYW5jZSBhbG9uZyBvcnRob2dvbmFsIGF4ZXMuIEl0IGludGVudGlvbmFsbHkgZG9lcyBub3QgdG91Y2ggb24gdGhlIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBhc3BlY3QuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQojIEZvciBkYXRhIHRyYW5zZm9ybWF0aW9uOgptb2R1bGVzOjppbXBvcnRfcGFja2FnZSgnZHBseXInLCBhdHRhY2ggPSBUUlVFKQptb2R1bGVzOjppbXBvcnQoJ2tsbXIvZ2dwbG90cycsIGF0dGFjaCA9IFRSVUUpCmBgYAoKRmlyc3Qgd2UgY3JlYXRlIGEgc21hbGwgcGxvdHRpbmcgaGVscGVyIHRoYXQgd2UgY2FuIHJldXNlIHdpdGggbmV3IGRhdGE7IHdl4oCZbGwgdXNlIGBjb29yZF9maXhlZGAgdG8gYmV0dGVyIGlsbHVzdHJhdGUgdGhlIHZhcmlhYmlsaXR5IGFjcm9zcyB0aGUgdHdvIGRpbWVuc2lvbnMuCgpgYGB7cn0KcGxvdCA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICBkYXRhID0gZGF0YSAlPiUKICAgICAgICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgbXV0YXRlKFNwZWNpZXMgPSBpcmlzJFNwZWNpZXMpCiAgICBjb2xzID0gYXMubGlzdChzZXROYW1lcyhjb2xuYW1lcyhkYXRhKSwgYygneCcsICd5JywgJ2NvbG9yJykpKQogICAgZ2dwbG90KGRhdGEsIGRvLmNhbGwoYWVzX3N0cmluZywgY29scykpICsgZ2VvbV9wb2ludCgpICsgY29vcmRfZml4ZWQoKQp9CmBgYAoKVG8gc2VlIHRoZSBkYXRhIGJlZm9yZSBpdHMgdHJhbnNmb3JtYXRpb24sIGxldOKAmXMgcGxvdCB0aGUgb3JpZ2luYWwgYGlyaXNgIGRpc3RyaWJ1dGlvbiBvZiBwZXRhbCB3aWR0aCBhbmQgbGVuZ3RoOgoKYGBge3J9CihwZXRhbF9kYXRhID0gc2VsZWN0KGlyaXMsIFBldGFsLldpZHRoLCBQZXRhbC5MZW5ndGgpKQpgYGAKCmBgYHtyfQpwbG90KHBldGFsX2RhdGEpCmBgYAoKTm93IHJvdGF0ZSB0aGUgZGF0YSBieSBwZXJmb3JtaW5nIFBDQToKCmBgYHtyfQpwY2EgPSBwcmNvbXAocGV0YWxfZGF0YSkKKHJvdGF0ZWRfcGV0YWxzID0gYXMuZGF0YS5mcmFtZShwY2EkeCkpCmBgYAoKQW5kIHBsb3QgdGhlIHJvdGF0ZWQgZGF0YToKCmBgYHtyfQpwbG90KHJvdGF0ZWRfcGV0YWxzKQpgYGAKClRoZSBgcHJjb21wYCBmdW5jdGlvbiBhbHNvIGdpdmVzIHVzIHRoZSBbcm90YXRpb24gbWF0cml4XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Sb3RhdGlvbl9tYXRyaXgpIFwoclwpIG9mIHRoZSBQQ0EsIHdoaWNoIGlzIGEgbWF0cml4IG9mIHRoZSByb3RhdGlvbuKAmXMgW2VpZ2VudmVjdG9yc10oaHR0cHM6Ly9nZW9yZ2VtZGFsbGFzLndvcmRwcmVzcy5jb20vMjAxMy8xMC8zMC9wcmluY2lwYWwtY29tcG9uZW50LWFuYWx5c2lzLTQtZHVtbWllcy1laWdlbnZlY3RvcnMtZWlnZW52YWx1ZXMtYW5kLWRpbWVuc2lvbi1yZWR1Y3Rpb24vKToKCmBgYHtyfQpwY2Ekcm90YXRpb24KYGBgCgooSW5jaWRlbnRhbGx5LCB0aGlzIGNvcnJlc3BvbmRzIHRvIGEgcm90YXRpb24gYW5nbGUgXChcdGhldGEgPSB7XG1hdGhvcHtccm0gYWNvc31yX3sxMX19IFxhcHByb3ggYHIgKHRoZXRhID0gcm91bmQoYWNvcyhwY2Ekcm90YXRpb25bMSwgMV0pIC8gcGkgKiAxODAsIDApKWDCsFwpLikKCldlIGNhbiBhcHBseSB0aGUgcm90YXRpb24gb3Vyc2VsdmVzIHZpYSBzaW1wbGUgbWF0cml4IG11bHRpcGxpY2F0aW9uOgoKYGBge3J9CnJvdGF0ZWRfcGV0YWxzMiA9IGFzLm1hdHJpeChwZXRhbF9kYXRhKSAlKiUgcGNhJHJvdGF0aW9uCgpwbG90KHJvdGF0ZWRfcGV0YWxzMikKYGBgCk5vdGUgdGhhdCB0aGlzIGZpZ3VyZSBsb29rcyBhbG1vc3QgaWRlbnRpY2FsIHRvIGByb3RhdGVkX3BldGFsc2A7IHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIFwoeFwpLSBhbmQgXCh5XCktYXhpcyBsYWJlbGxpbmc6IGJ5IGRlZmF1bHQsIGBwcmNvbXBgICpjZW50ZXJzKiB0aGUgZGF0YSBiZWZvcmUgcm90YXRpb247IElmIHdlIHdhbnRlZCB0byBkbyB0aGUgc2FtZSwgd2XigJlkIGhhdmUgdG8gY29sdW1uLXdpc2Ugc3VidHJhY3QgYHBjYSRjZW50ZXJgIGZyb20gb3VyIHJvdGF0ZWQgZGF0YSAod2hpY2ggaXMgaWRlbnRpY2FsIHRvIGBjb2xNZWFucyhwZXRhbF9kYXRhKWApLgoKRmluYWxseSB3ZSBjYW4gdmlzdWFsaXNlIHRoZSByb3RhdGlvbnPigJkgZWlnZW52ZWN0b3JzIGFuZCBlaWdlbnZhbHVlcyAoW3doaWNoIGFyZSBib3RoIGZhY3RvcnMgb2YgdGhlICpsb2FkaW5ncypdKGh0dHBzOi8vc3RhdHMuc3RhY2tleGNoYW5nZS5jb20vcS8xNDM5MDUvMzUxMikpIGluIGEgc28tY2FsbGVkIFsqYmlwbG90Kl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmlwbG90KS4gYHBjYSRzZGV2YCwgdGhlIHJvdGF0aW9u4oCZcyBzdGFuZGFyZCBkZXZpYXRpb24sIGlzIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgZWlnZW52YWx1ZXM7IHdlIHRoZXJlZm9yZSBnZXQ6CgpgYGB7cn0KKGxvYWRpbmdzID0gc3dlZXAocGNhJHJvdGF0aW9uLCAyLCBwY2Ekc2RldiwgYCpgKSkKYGBgCgpBIGJpcGxvdCBpcyB0aGUgUENBIHBsb3QgYXVnbWVudGVkIGJ5IGFycm93cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2FkaW5nczoKCmBgYHtyIGVjaG89RkFMU0V9CmFycm93cyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICBkYXRhID0gZGF0YSAlPiUKICAgICAgICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgbXV0YXRlKFZhcmlhYmxlID0gcm93bmFtZXMoLikpCiAgICAKICAgIGxpc3QoZ2VvbV9zZWdtZW50KGFlcygwLCAwLCB4ZW5kID0gUEMxLCB5ZW5kID0gUEMyLCBjb2xvciA9IE5BKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGFycm93ID0gZ3JpZDo6YXJyb3cobGVuZ3RoID0gZ3JpZDo6dW5pdCgwLjA1LCAnaW4nKSksCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICdncmF5NTAnKSwKICAgICAgICAgZ2VvbV90ZXh0KGFlcyhQQzEgKiAxLjIsIFBDMiAqIDEuMiwgbGFiZWwgPSBWYXJpYWJsZSwgY29sb3IgPSBOQSksCiAgICAgICAgICAgICAgICAgICBkYXRhLCBjb2xvciA9ICdncmF5NTAnLCBzaXplID0gMykpCn0KYGBgCgpgYGB7cn0KcGxvdChyb3RhdGVkX3BldGFscykgKyBhcnJvd3MobG9hZGluZ3MpCmBgYAoKSWYsIGluc3RlYWQsIHdlIHBsb3QgdGhlIGVpZ2VudmVjdG9ycyBkaXJlY3RseSwgd2UgY2FuIHNlZSBpbW1lZGlhdGVseSBob3cgdGhlIGRhdGEgaGFzIGJlZW4gcm90YXRlZCBmcm9tIGl0cyBvcmlnaW5hbCBmb3JtIGludG8gdGhlIFBDQToKCmBgYHtyfQpwbG90KHJvdGF0ZWRfcGV0YWxzKSArIGFycm93cyhwY2Ekcm90YXRpb24pCmBgYAoKVGhlIGFycm93cyBkbyBpbmRlZWQgY29ycmVzcG9uZCB0byB0aGUgb3JpZ2luYWwgKGNlbnRyZWQpIGF4ZXMgb2YgdGhlIGlyaXMgcGV0YWwgZGF0YSwgYW5kIHRoZSBwbG904oCZcyBjbG9ja3dpc2UgdGlsdCBieSBcKGByIHRoZXRhYMKwXCkgYmVjb21lcyBhcHBhcmVudC4K