Je voudrais proposer une solution alternative, une solution robuste similaire à ce que je m'apprête à proposer était nécessaire dans la dernière version de ggtern, depuis l'introduction de la fonction de rotation du canvas.
Fondamentalement, vous devez déterminer les positions relatives en utilisant la trigonométrie, en construisant une fonction qui renvoie un objet element_text
, en donnant l'angle (c'est-à-dire en degrés) et les informations de positionnement (c'est-à-dire l'une des informations suivantes : x, y, haut ou droite).
#Charger les bibliothèques requises
library(ggplot2)
library(gridExtra)
#Construire une fonction pour retourner un objet Element Text
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' doit être l'un des [%s]",paste(names(positions),collapse=", ")),call.=FALSE)
if(!is.numeric(angle))
stop("'angle' doit être numérique",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)
}
Honnêtement, à mon avis, je pense qu'une option 'auto' devrait être disponible dans ggplot2
pour les arguments hjust
et vjust
, lors de la spécification de l'angle, quoi qu'il en soit, démontrons comment cela fonctionne ci-dessus.
#Démontrer l'utilisation pour une variété de 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)
Ce qui produit ce qui suit :
6 votes
Comme ggplot 3.3.0 est maintenant sorti, à mon avis, la réponse acceptée devrait être changée en celle de jan-glx.