labels studio - Beschriftungen für rotierende Achsen und Abstände in ggplot2




beispiele formatieren (5)

Ich habe ein Diagramm, bei dem die x-Achse ein Faktor ist, dessen Beschriftungen lang sind. Obwohl es wahrscheinlich keine ideale Visualisierung ist, möchte ich diese Etiketten jetzt 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))


Answers

Um den Text auf den Hilfsstrichsbeschriftungen vollständig sichtbar zu machen und in der gleichen Richtung wie die y-Achsenbeschriftung zu lesen, ändern Sie die letzte Zeile in

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

Verwende + coord_flip() .

In "R for Data Science" sprechen Wickham und Grolemund genau zu diesem Problem. In Kapitel 3.8, Position Adjustments , schreiben sie:

coord_flip() schaltet die x- und y-Achse um. Dies ist beispielsweise nützlich, wenn Sie horizontale Boxplots wünschen. Es ist auch nützlich für lange Etiketten: es ist schwierig, sie zu erhalten, ohne sich auf der x-Achse zu überlappen.

Wenn Sie dies auf Ihren Plot + coord_flip() , fügen + coord_flip() einfach + coord_flip() zum ggplot hinzu:

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

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

Und nun sind die superlangen Titel horizontal verteilt und sehr gut lesbar!


Ändern Sie die letzte Zeile in

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

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

Das Bild oben ist von diesem Blogpost .


Ich würde gerne eine alternative Lösung anbieten , eine stabile Lösung, ähnlich der, die ich vorschlage, war in der neuesten Version von ggtern erforderlich , seit die Canvas-Rotation eingeführt wurde.

Grundsätzlich müssen Sie die relativen Positionen mithilfe der Trigonometrie bestimmen, indem Sie eine Funktion element_text , die ein element_text Objekt element_text , gegebener Winkel (dh Grad) und Positionierung (dh eine der x-, y-, oberen oder rechten) Informationen.

#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, meiner Meinung nach sollte in ggplot2 eine ' ggplot2 -Option für die Argumente hjust und vjust zur Verfügung vjust , bei der Angabe des Winkels sollten wir jedoch demonstrieren, wie das oben vjust 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)

Was folgendes bewirkt:


[Hinweis: bearbeitet, um die ggplot-Syntax zu modernisieren]

Ihr Beispiel ist nicht reproduzierbar, da es kein ex1221new gibt (es gibt ein ex1221 in Sleuth2 , also denke ich, dass Sie das gemeint haben). Außerdem brauchen Sie (und sollten nicht) Spalten herausziehen, um sie an ggplot zu senden. Ein Vorteil ist, dass ggplot direkt mit data.frame .

Sie können die Beschriftungen mit xlab() und ylab() oder Teil des Aufrufs von scale_*.* Machen.

library("Sleuth2")
library("ggplot2")
ggplot(ex1221, aes(Discharge, Area)) +
  geom_point(aes(size=NO3)) + 
  scale_size_area() + 
  xlab("My x label") +
  ylab("My y label") +
  ggtitle("Weighted Scatterplot of Watershed Area vs. Discharge and Nitrogen Levels (PPM)")

ggplot(ex1221, aes(Discharge, Area)) +
  geom_point(aes(size=NO3)) + 
  scale_size_area("Nitrogen") + 
  scale_x_continuous("My x label") +
  scale_y_continuous("My y label") +
  ggtitle("Weighted Scatterplot of Watershed Area vs. Discharge and Nitrogen Levels (PPM)")

Ein alternativer Weg, um nur Etiketten anzugeben (praktisch, wenn Sie keine anderen Aspekte der Waage ändern), ist die Verwendung der labs Funktion

ggplot(ex1221, aes(Discharge, Area)) +
  geom_point(aes(size=NO3)) + 
  scale_size_area() + 
  labs(size= "Nitrogen",
       x = "My x label",
       y = "My y label",
       title = "Weighted Scatterplot of Watershed Area vs. Discharge and Nitrogen Levels (PPM)")

was dem obigen eine identische Figur gibt.







r ggplot2 labels