Ich möchte eine alternative Lösung anbieten, eine robuste Lösung, die dem ähnelt, was ich jetzt vorschlage, war in der letzten Version von ggtern seit der Einführung der Funktion zur Drehung der Leinwand.
Grundsätzlich müssen Sie die relativen Positionen mithilfe der Trigonometrie bestimmen, indem Sie eine Funktion erstellen, die eine element_text
Objekt, mit Angabe des Winkels (d.h. Grad) und der Position (d.h. einer der Werte x, y, oben oder rechts).
#Load Required Libraries
library(ggplot2)
library(gridExtra)
#Build Function to Return Element Text Object
rotatedAxisElementText = function(angle,position='x'){
angle = angle[1];
position = position[1]
positions = list(x=0,y=90,top=180,right=270)
if(!position %in% names(positions))
stop(sprintf("'position' must be one of [%s]",paste(names(positions),collapse=", ")),call.=FALSE)
if(!is.numeric(angle))
stop("'angle' must be numeric",call.=FALSE)
rads = (angle - positions[[ position ]])*pi/180
hjust = 0.5*(1 - sin(rads))
vjust = 0.5*(1 + cos(rads))
element_text(angle=angle,vjust=vjust,hjust=hjust)
}
Ehrlich gesagt bin ich der Meinung, dass die Option "Automatisch" in folgenden Bereichen verfügbar sein sollte ggplot2
für die hjust
y vjust
Argumente bei der Angabe des Winkels. Wie auch immer, lassen Sie uns demonstrieren, wie das oben genannte funktioniert.
#Demonstrate Usage for a Variety of Rotations
df = data.frame(x=0.5,y=0.5)
plots = lapply(seq(0,90,length.out=4),function(a){
ggplot(df,aes(x,y)) +
geom_point() +
theme(axis.text.x = rotatedAxisElementText(a,'x'),
axis.text.y = rotatedAxisElementText(a,'y')) +
labs(title = sprintf("Rotated %s",a))
})
grid.arrange(grobs=plots)
Daraus ergibt sich das Folgende: