Arrows of underlying variables in PCA biplot in R At the risk of making the question software-specific, and with the excuse of its ubiquity and idiosyncrasies, I want to ask about the function biplot() in R, and, more specifically, about the calculation and plotting of its default, superimposed red arrows, corresponding to the underlying variables.

[To make sense of some of the comments, the plots initially posted had a sclaing problem of scarce interest, and are now erased.]
 A: The biplot() function following a PCA using prcomp() is minimal in functionality. As we all (should) know, ggplot() offers maximal functionality. So the trick is to get the arrows from a PCA using prcomp() into a format for plotting in ggplot(). Or at least I would see this as a solution to the initial question of this thread.
This is relatively straightforward. Note that my post is partially inspired by this post from Benjamin Bell. Also, the iris data are not necessarily ideal for this, but should provide enough for the user to see the potential here.
R Code
`library("tidyverse",
    "ggplot2")

# Load iris data
iris <- iris

# Select variables to run PCA
iris_pca <- select(iris, -Species)

# PCA with prcomp
m1 <- prcomp(iris_pca, center = T, scale = T)

# Get principal loadings of first two components
iris$PC1 <- predict(m1, newdata = iris)[,1]
iris$PC2 <- predict(m1, newdata = iris)[,2]

# Get arrow end point locations (loadings*2 for effect)
l.x <- m1$rotation[,1]*2
l.y <- m1$rotation[,2]*2

# Get label positions (%15 further than end of arrows)
l.posx <- l.x*1.15
l.posy <- l.y*1.15

# Get labels for plot (variable names)
l.labels <- row.names(m1$rotation)

# Plot with grouping by flower
ggplot() +
  geom_point(data = iris, aes(PC1, PC2, color = Species), size = 1) +
  scale_color_manual(values = c("#287D8EFF", "#482677FF", "#20A387FF")) + #colorblind pal
  geom_segment(aes(x=0, y=0, xend = l.x, yend = l.y), 
               arrow = arrow(length = unit(0.2, "cm"), type = "closed"),
               color = "darkorange4") +
  geom_text(aes(x = l.posx, y = l.posy, label = l.labels), 
            color = "darkorange4", size = 2, hjust = 0) + # labels
  theme_classic()

# Packages
sessionInfo()`


Packages and versions:
cellranger_1.1.0 pillar_1.7.0     compiler_4.1.3   dbplyr_2.1.1     tools_4.1.3
digest_0.6.29    jsonlite_1.8.0   lubridate_1.8.0  lifecycle_1.0.1  gtable_0.3.0
pkgconfig_2.0.3  rlang_1.0.2      reprex_2.0.1     rstudioapi_0.13  DBI_1.1.2
cli_3.2.0        haven_2.4.3      xml2_1.3.3       withr_2.5.0      httr_1.4.2      fs_1.5.2         generics_0.1.2   vctrs_0.3.8      hms_1.1.1        grid_4.1.3
tidyselect_1.1.2 glue_1.6.2       R6_2.5.1         fansi_1.0.3      readxl_1.4.0
farver_2.1.0     tzdb_0.3.0       modelr_0.1.8     magrittr_2.0.2   backports_1.4.1
scales_1.1.1     ellipsis_0.3.2   rvest_1.0.2      assertthat_0.2.1 colorspace_2.0-3
labeling_0.4.2   utf8_1.2.2       stringi_1.7.6    munsell_0.5.0    broom_0.7.12
crayon_1.5.1
