r - Rotating and spacing axis labels in ggplot2

ID : 2216

viewed : 133

Tags : rggplot2labelr





Top 5 Answer for r - Rotating and spacing axis labels in ggplot2

vote vote

94

Change the last line to

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

By default, the axes are aligned at the center of the text, even when rotated. When you rotate +/- 90 degrees, you usually want it to be aligned at the edge instead:

alt text

The image above is from this blog post.

vote vote

81

Use 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


Add 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 Ch 3.9 of R for Data Science, Wickham and Grolemund speak to this exact question:

coord_flip() switches the x and y axes. This is useful (for example), if you want horizontal boxplots. It’s also useful for long labels: it’s hard to get them to fit without overlapping on the x-axis.

vote vote

77

To make the text on the tick labels fully visible and read in the same direction as the y-axis label, change the last line to

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

66

ggplot 3.3.0 fixes this by providing guide_axis(angle = 90) (as guide argument to scale_.. or as x argument to 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 

From the documentation of the angle argument:

Compared to setting the angle in theme() / element_text(), this also uses some heuristics to automatically pick the hjust and vjust that you probably want.


Alternatively, it also provides guide_axis(n.dodge = 2) (as guide argument to scale_.. or as x argument to guides) to overcome the over-plotting problem by dodging the labels vertically. It works quite well in this case:

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 

vote vote

60

I'd like to provide an alternate solution, a robust solution similar to what I am about to propose was required in the latest version of ggtern, since introducing the canvas rotation feature.

Basically, you need to determine the relative positions using trigonometry, by building a function which returns an element_text object, given angle (ie degrees) and positioning (ie one of x,y,top or right) information.

#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) } 

Frankly, in my opinion, I think that an 'auto' option should be made available in ggplot2 for the hjust and vjust arguments, when specifying the angle, anyway, lets demonstrate how the above works.

#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) 

Which produces the following:

Example

Top 3 video Explaining r - Rotating and spacing axis labels in ggplot2







Related QUESTION?