Rotations- und Abstandsachsenbeschriftungen in ggplot2

667

Ich habe ein Diagramm, in dem die x-Achse ein Faktor ist, dessen Beschriftungen lang sind. Obwohl dies wahrscheinlich keine ideale Visualisierung ist, möchte ich diese Beschriftungen vorerst einfach vertikal drehen. Ich habe diesen Teil mit dem folgenden Code 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))

Geben Sie hier die Bildbeschreibung ein

Christopher DuBois
quelle

Antworten:

1106

Ä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 stattdessen am Rand ausgerichtet wird:

Alt-Text

Das Bild oben stammt aus diesem Blogbeitrag .

Jonathan Chang
quelle
95
In der neuesten Version von ggplot2 wäre der Befehl: q + theme(axis.text.x=element_text(angle = -90, hjust = 0))
rnorberg
55
Versuchen Sie es mit denen, für die sich hjust nicht wie hier beschrieben verhält theme(axis.text.x=element_text(angle = 90, vjust = 0.5)). Ab ggplot2 0.9.3.1 scheint dies die Lösung zu sein.
Lilster
42
Eigentlich musste ich die beiden oben genannten Lösungen kombinieren, um korrekt ausgerichtete Beschriftungen zu erhalten:q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
jupp0r
32
@ jupp0r ist richtig. theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))IST DIE EINE, DIE AKTUELL ARBEITET.
51
Wenn Sie 45 ° gedrehte Etiketten (leichter zu lesen) theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))
möchten, erhalten Sie
88

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

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

Verwenden coord_flip()

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

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

Geben Sie hier die Bildbeschreibung ein


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

coord_flip()schaltet die x- und y-Achse um. 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.

Reicher Pauloo
quelle
26

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_textObjekt mit einem bestimmten Winkel (dh Grad) und einer Positionierungsinformation (dh einer von x, y, oben oder rechts) zurückgibt .

#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 denke ich, dass eine 'Auto'-Option ggplot2für die Argumente hjustund verfügbar gemacht werden sollte. vjustWenn Sie den Winkel angeben, können Sie trotzdem 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)

Welches erzeugt das folgende:

Beispiel

Nicholas Hamilton
quelle
1
Ich erhalte nicht die gleichen Ergebnisse, für mich wird der Achsentext mit Ihrer Auto-Methode nie gut angepasst. Die Verwendung rads = (-angle - positions[[ position ]])*pi/180ergab jedoch bessere Platzierungen. Beachten Sie das zusätzliche Minuszeichen vor dem Winkel.
Trotzdem
7

Das ggpubr- Paket bietet eine Verknüpfung, die standardmäßig das Richtige tut (Text rechts ausrichten, Textfeld in der Mitte ausrichten, um sie 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 durch das reprex-Paket (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

krlmlr
quelle
5

Alternativ ggplot 3.3.0bietet guide_axis(n.dodge = 2)(als guideArgument scale_..oder als xArgument guides) das über Plotten Problem zu überwinden , indem die Etiketten vertikal ausweichen. In diesem Fall funktioniert es ganz 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

jan-glx
quelle
1

Um lesbare x-Tick-Beschriftungen ohne zusätzliche Abhängigkeiten zu erhalten, möchten Sie Folgendes verwenden:

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

Dadurch werden die Häkchen um 90 ° gegen den Uhrzeigersinn gedreht und an ihrem Ende ( hjust = 1) und ihren Mitten horizontal mit dem entsprechenden Häkchen ( vjust = 0.5) ausgerichtet.

Vollständiges Beispiel:

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))


Beachten Sie, dass die vertikalen / horizontalen Ausrichtungsparameter vjust/ hjustvon element_textrelativ zum Text sind. Ist daher vjustfür die horizontale Ausrichtung verantwortlich.

Ohne vjust = 0.5würde es so aussehen:

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

Ohne hjust = 1würde es so aussehen:

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

Wenn Sie aus irgendeinem (verdrahteten) Grund die Häkchen um 90 ° im Uhrzeigersinn drehen möchten (so dass sie von links abgelesen werden können), müssen Sie Folgendes verwenden : q + theme(axis.text.x = element_text(angle = -90, vjust = 0.5, hjust = -1)).

All dies wurde bereits in den Kommentaren dieser Antwort besprochen , aber ich komme so oft auf diese Frage zurück, dass ich eine Antwort möchte, von der ich einfach kopieren kann, ohne die Kommentare zu lesen.

jan-glx
quelle
0

Eine Alternative dazu coord_flip()ist die Verwendung des ggstancePakets. Der Vorteil ist, dass es einfacher ist, die Diagramme mit anderen Diagrammtypen zu kombinieren, und Sie können, was vielleicht noch wichtiger ist, feste Skalierungsverhältnisse für Ihr Koordinatensystem festlegen .

library(ggplot2)
library(ggstance)

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

ggplot(data=diamonds, aes(carat, cut)) + geom_boxploth()

Erstellt am 2020-03-11 durch das reprex-Paket (v0.3.0)

Tjebo
quelle