Jedes Mal, wenn ich mit ggplot einen Plot erstelle, verbringe ich ein wenig Zeit damit, verschiedene Werte für hjust und vjust in einer Zeile wie auszuprobieren
+ opts(axis.text.x = theme_text(hjust = 0.5))
Damit die Achsenbeschriftungen dort ausgerichtet werden, wo die Achsenbeschriftungen fast die Achse berühren und bündig mit dieser sind (sozusagen auf die Achse ausgerichtet). Ich verstehe jedoch nicht wirklich, was los ist. Oft hjust = 0.5
gibt es so dramatisch unterschiedliche Ergebnisse hjust = 0.6
, zum Beispiel, dass ich es nicht herausfinden konnte, indem ich nur mit verschiedenen Werten herumspielte.
Kann mir jemand eine umfassende Erklärung geben, wie Hjust- und Vjust-Optionen funktionieren?
Antworten:
Der Wert von
hjust
undvjust
wird nur zwischen 0 und 1 definiert:Quelle: ggplot2, Hadley Wickham, Seite 196
(Ja, ich weiß, dass Sie es in den meisten Fällen außerhalb dieses Bereichs verwenden können, aber erwarten Sie nicht, dass es sich auf eine bestimmte Weise verhält. Dies liegt außerhalb der Spezifikation.)
hjust
steuert die horizontale Ausrichtung undvjust
die vertikale Ausrichtung.Ein Beispiel sollte dies klarstellen:
Um zu verstehen, was passiert, wenn Sie den
hjust
Text in der Achse ändern , müssen Sie verstehen, dass die horizontale Ausrichtung für den Achsentext nicht in Bezug auf die x-Achse, sondern auf das gesamte Diagramm (einschließlich des Textes auf der y-Achse) definiert ist. (Dies ist meiner Ansicht nach unglücklich. Es wäre viel nützlicher, die Ausrichtung relativ zur Achse zu haben.)So untersuchen Sie, was mit der
vjust
Ausrichtung von Achsenbeschriftungen geschieht :quelle
Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)
fürvjust = .72
und höher.Am definitivsten ist wahrscheinlich Abbildung B.1 (d) des ggplot2-Buches, dessen Anhänge unter http://ggplot2.org/book/appendices.pdf verfügbar sind .
Ganz so einfach ist es jedoch nicht.
hjust
undvjust
wie beschrieben gibt es, wie es ingeom_text
undtheme_text
(manchmal) funktioniert . Eine Möglichkeit, sich das vorzustellen, besteht darin, sich ein Feld um den Text vorzustellen, bei dem sich der Bezugspunkt auf dieses Feld bezieht, und zwar in Einheiten relativ zur Größe des Feldes (und daher für Texte unterschiedlicher Größe unterschiedlich). Einhjust
Wert von 0,5 und einvjust
Wert von 0,5 zentrieren die Box auf dem Referenzpunkt. Durch Reduzieren wirdhjust
die Box um einen Betrag der Boxbreite nach rechts verschoben0.5-hjust
. Wennhjust=0
sich also der linke Rand der Box am Referenzpunkt befindet. Durch Erhöhen wirdhjust
die Box um einen Betrag der Boxbreite nach links verschobenhjust-0.5
. Wannhjust=1
wird die Box eine halbe Boxbreite von der Mitte nach links verschoben, wodurch die rechte Kante auf den Referenzpunkt gelegt wird. Wennhjust=2
der rechte Rand der Box eine Boxbreite links vom Referenzpunkt ist (Mitte sind die2-0.5=1.5
Boxbreiten links vom Referenzpunkt. Bei der Vertikalen ist weniger oben und mehr unten. Dies ist effektiv das, was in Abbildung B.1 (d ) sagt, aber es extrapoliert über [0,1] hinaus.Aber manchmal funktioniert das nicht. Beispielsweise
Die drei letzteren Diagramme sind identisch. Ich weiß nicht warum das so ist. Wenn Text gedreht wird, ist dies auch komplizierter. Erwägen
Bei der ersten sind die Beschriftungen linksbündig (gegen den Boden) ausgerichtet, bei der zweiten sind sie in einem Feld zentriert, sodass ihre Mitten ausgerichtet sind, und bei der dritten sind sie rechtsbündig ausgerichtet (sodass ihre rechten Seiten neben der Achse ausgerichtet sind). Das letzte kann ich nicht kohärent erklären. Es hat etwas mit der Größe des Textes zu tun, der Größe des breitesten Textes, und ich bin mir nicht sicher, was noch.
quelle
DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
- dh mit einem\n
Zeilenumbruch in einem der Titel.hjust
undvjust
sind nur zwischen 0 und 1 definiert; Verhalten außerhalb dieses Bereichs muss keinen Sinn ergeben.hjust=0
richtet die linke Kante mit dem tic;hjust=0.5
zentriert sich auf den Tic;hjust=1
Richtet die rechte Kante am Tic aus (Verschieben des Felds relativ zum Referenzpunkt). Abervjust
ausrichtet innerhalb einer Box , die Größe des höchsten Label.vjust
Achsenbeschriftungen werden alle Beschriftungen gleichzeitig zueinander ausgerichtet. So werden alle Oberkanten wannvjust=1
und ebenso alle Unterkanten wann ausgerichtetvjust=0
. Das macht für mich vollkommen Sinn.