Меня разочаровали ограничения ggbiplot
, поэтому я скопировал участки кода из функции, чтобы использовать их в стандартном вызове ggplot
.
# Load data
DATA <- data.frame(iris)
# Do PCA
PCA <- prcomp(iris[,1:4])
# Extract PC axes
PCAvalues <- data.frame(Species = iris$Species, PCA$x)
# Extract loadings of the variables
PCAloadings <- data.frame(Variables = rownames(PCA$rotation), PCA$rotation)
# Calculate the angles and the label offset
PCAloadings$Angle = ((180/pi) * atan(PCAloadings$PC2/PCAloadings$PC1))
PCAloadings$Offset <- ((-2 * sign(PCAloadings$PC1))/2)
# Plot
ggplot(PCAvalues, aes(x = PC1, y = PC2, colour = Species)) +
stat_ellipse(level = 0.95, size = 2, show.legend = FALSE) +
geom_point(size = 3) +
geom_segment(data = PCAloadings, aes(x = 0, y = 0, xend = (PC1), yend = (PC2)),
arrow = arrow(length = unit(1/2, "picas")), color = "black") +
geom_text(data = PCAloadings, aes(label = Variables, x = (PC1), y = (PC2)),
color = "black", size = 4, angle = PCAloadings$Angle, hjust =
PCAloadings$Offset) +
theme_classic() +
theme(legend.justification = c(1,1), legend.position = c(1,1))
Ответы:
Q1. - как утверждает @Andrew John Lowe в своем ответе, слои создаются в том порядке, в котором вы их вводите, поэтому, если строка geom_segment
последняя, она появится сверху.
Q2. - изменить цвет стрелки с аргументом colour
в вызове geom_segment
. Измените шрифт size
меток в вызове geom_text
.
Q3. - снова изменить аргумент size
в вызове stat_ellipse
.
Q4. - вызов theme
решит эту проблему, c(1,1)
указывает, где на графике должна появиться легенда, 0
слева и 1
справа.
Это не совсем идеально, поскольку вам нужно указать PCAloadings$Offset
для меток стрелок вручную, и может потребоваться немного проб и ошибок, чтобы получить желаемое расстояние, или даже потребуется ввести пользовательские числа в фрейм данных для каждой метки. Однако теперь вы можете использовать остальную часть ggplot
как обычно.
person
EcologyTom
schedule
28.03.2018