917 Stimmen

Achsenbeschriftungen in ggplot2 drehen und beabstanden

Ich habe ein Diagramm, bei dem die x-Achse ein Faktor ist, dessen Beschriftungen lang sind. Während wahrscheinlich nicht eine ideale Visualisierung, für jetzt möchte ich einfach drehen diese Etiketten vertikal zu sein. Ich habe diesen Teil mit dem Code unten herausgefunden, aber wie Sie sehen können, 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

1537voto

Jonathan Chang Punkte 23097

Ändern Sie die letzte Zeile in

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

Standardmäßig werden die Achsen in der Mitte des Textes ausgerichtet, auch wenn sie gedreht werden. Wenn Sie den Text um +/- 90 Grad drehen, möchten Sie ihn in der Regel stattdessen am Rand ausrichten:

alt text

Das Bild oben stammt von dieser Blogbeitrag .

193voto

jan-glx Punkte 5868

ggplot 3.3.0 behebt dies durch die Bereitstellung von guide_axis(angle = 90) (als guide Argument zu scale_.. oder als x Argument zu guides ):

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

ggplot(diamonds, aes(cut, carat)) +
  geom_boxplot() +
  scale_x_discrete(guide = guide_axis(angle = 90)) +
  # ... or, equivalently:
  # guides(x =  guide_axis(angle = 90)) +
  NULL

Von die Dokumentation der angle Argument :

Im Vergleich zur Einstellung des Winkels in theme() / element_text() werden auch einige Heuristiken verwendet, um automatisch die hjust und vjust zu wählen, die Sie wahrscheinlich wollen.


Alternativ dazu bietet sie auch guide_axis(n.dodge = 2) (als guide Argument zu scale_.. oder als x Argument zu guides ), um das Problem der Überzeichnung zu lösen, indem ich die Beschriftungen vertikal ausblende. Das funktioniert in diesem Fall recht gut:

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

ggplot(diamonds, aes(cut, carat)) + 
  geom_boxplot() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  NULL

146voto

Rich Pauloo Punkte 6567

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


hinzufügen str_wrap()

# wrap text to no more than 15 spaces
library(stringr)
diamonds$cut2 <- str_wrap(diamonds$cut, width = 15)
qplot(cut2, carat, data = diamonds, geom = "boxplot") +
  coord_flip()

enter image description here


In Kapitel 3.9 von R für Datenwissenschaft Wickham und Grolemund sprechen genau diese Frage an:

coord_flip() schaltet die x- und y-Achse um. Dies ist z. B. nützlich, wenn Sie horizontale Boxplots wünschen. Es ist auch nützlich für lange Beschriftungen: Es ist schwer, sie ohne Überlappung auf der x-Achse unterzubringen.

105voto

e3bo Punkte 1633

Damit der Text auf den Häkchenbeschriftungen vollständig sichtbar ist und in der gleichen Richtung wie die y-Achsenbeschriftung gelesen wird, ändern Sie die letzte Zeile in

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

33voto

Nicholas Hamilton Punkte 9355

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:

Example

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X