it-swarm.com.de

Achsenbeschriftungen in ggplot2 drehen und beabstanden

Ich habe eine Darstellung, in der die x-Achse ein Faktor ist, dessen Beschriftungen lang sind. Während dies wahrscheinlich keine ideale Visualisierung ist, möchte ich diese Beschriftungen vorerst einfach drehen, um sie vertikal auszurichten. Ich habe diesen Teil mit dem folgenden Code herausgefunden, aber wie Sie sehen, sind die Beschriftungen nicht vollständig sichtbar.

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + opts(axis.text.x=theme_text(angle=-90))

enter image description here

575

Ändern Sie die letzte Zeile in

q + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Standardmäßig werden die Achsen in der Mitte des Texts ausgerichtet, auch wenn sie gedreht werden. Wenn Sie +/- 90 Grad drehen, möchten Sie normalerweise, dass es am Rand ausgerichtet wird:

alt text

Das Bild oben ist von dieser Blog-Beitrag .

979
Jonathan Chang

Ändern Sie die letzte Zeile in, um den Text auf den Teilstrichbeschriftungen vollständig sichtbar zu machen und in der gleichen Richtung wie die Beschriftung auf der y-Achse zu lesen

q + theme(axis.text.x=element_text(angle=90, hjust=1))
79
e3bo

Verwenden Sie coord_flip()

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

qplot(cut,carat,data = diamonds, geom = "boxplot") +
  coord_flip()

enter image description here


In Kapitel 3.9 von R for Data Science sprechen Wickham und Grolemund genau diese Frage an:

coord_flip() wechselt die x- und y-Achse. Dies ist beispielsweise nützlich, wenn Sie horizontale Boxplots wünschen. Dies ist auch für lange Beschriftungen nützlich: Es ist schwierig, sie ohne Überlappung auf der x-Achse anzupassen.

71
Rich Pauloo

Ich möchte eine alternative Lösung anbieten. Eine robuste Lösung, die der von mir vorgeschlagenen ähnelt, war in der neuesten Version von ggtern erforderlich, da die Funktion zum Drehen der Zeichenfläche eingeführt wurde.

Grundsätzlich müssen Sie die relativen Positionen mithilfe der Trigonometrie bestimmen, indem Sie eine Funktion erstellen, die ein element_text -Objekt zurückgibt, wobei der Winkel (dh Grad) und die Position (dh eine der Informationen x, y, oben oder rechts) angegeben werden.

#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 sollte meiner Meinung nach in ggplot2 für die Argumente hjust und vjust eine Option 'auto' zur Verfügung gestellt werden oben 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)

Welche erzeugt die folgenden:

Example

22

Das ggpubr -Paket bietet eine Verknüpfung, die standardmäßig das Richtige tut (Text rechts ausrichten, Textfeld mitte ausrichten, um anzukreuzen):

library(ggplot2)
diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))
q <- qplot(cut, carat, data = diamonds, geom = "boxplot")
q + ggpubr::rotate_x_text()

Erstellt am 06.11.2018 von reprex package (v0.2.1)

Gefunden mit einer GitHub-Suche nach den relevanten Argumentnamen: https://github.com/search?l=R&q=element_text+angle+90+vjust+org%3Acran&type=Code

5
krlmlr