How to justify text axis labels in R ggplot
Asked Answered
J

3

10

I have a bar chart with text labels along the x-axis. Some of the labels are quite lengthy and I would like to make them look neater. Any ideas of how I might achieve that?

library(sjPlot)
require(ggplot2)
require(ggthemes)
WAM_3_plot <- sjp.frq(WAM_Dec13_R2$WAM_3, title= c("WAM Item 3"),
    axisLabels.x=c("Disruptive behaviour can be contained and does not spread to other patients.  Generally, behaviour on the ward is positive and pro-therapeutic.", 
                   "1", "2","3","4",
                   "Disruptive behaviour by one patient tends to spread to other patients and is only contained with great difficulty. The general level of behaviour seems to be getting more counter-therapeutic."),
    barColor = c("palegreen4", "palegreen3", "palegreen2", "brown1", "brown2", "brown3"),
    upperYlim = 25,
    valueLabelSize = 5,
    axisLabelSize = 1.2,
    breakLabelsAt=14, returnPlot=TRUE) 
WAM_3_plot + theme(axis.text.x=element_text(hjust=0.5))
Jailhouse answered 31/1, 2014 at 11:48 Comment(0)
A
14

Like this?

Since you didn't provide any data, we have no way of knowing what your attempt looks like, but this seems like it might be close. The main feature is the use of strwrap(...) to insert CR (\n) into your labels.

set.seed(1)
library(ggplot2)
axisLabels.x <- c("Disruptive behaviour can be contained and does not spread to other patients.  Generally, behaviour on the ward is positive and pro-therapeutic.", 
               "1", "2","3","4",
               "Disruptive behaviour by one patient tends to spread to other patients and is only contained with great difficulty. The general level of behaviour seems to be getting more counter-therapeutic.")
labels.wrap  <- lapply(strwrap(axisLabels.x,50,simplify=F),paste,collapse="\n") # word wrap
gg <- data.frame(x=LETTERS[1:6], y=sample(1:10,6))
ggplot(gg) +
  geom_bar(aes(x,y, fill=x), stat="identity")+
  scale_x_discrete(labels=labels.wrap)+
  scale_fill_discrete(guide="none")+
  labs(x="",y="Response")+
  coord_flip()
Allieallied answered 31/1, 2014 at 15:48 Comment(1)
You're welcome. Since you're new to SO, this link explains what to do when someone answers your question. The convention is to wait 24 hrs before accepting an answer, in case someone else comes along with a better one.Allieallied
I
3

You may change the breakLabelsAt parameter, decrease the axisLabelSize and set flipCoordinates to TRUE, then you get similar results. I used the efc-sample data set which is included in the sjPlot-package:

data(efc)
sjp.frq(efc$e42dep, title=c("WAM Item 3"),
    axisLabels.x=c("Disruptive behaviour can be contained and does not spread to other patients.  Generally, behaviour on the ward is positive and pro-therapeutic.", 
      "1", "2",
      "Disruptive behaviour by one patient tends to spread to other patients and is only contained with great difficulty. The general level of behaviour seems to be getting more counter-therapeutic."),
    valueLabelSize=5,
    axisLabelSize=.8,
    breakLabelsAt=50,
    flipCoordinates=T)

enter image description here

Iceni answered 10/4, 2014 at 12:55 Comment(0)
B
2

Rotating the axis labels can help a lot:

theme(axis.text.x  = element_text(angle=90, vjust=0.5))
Barbarous answered 31/1, 2014 at 12:27 Comment(3)
Thanks for the suggestion but it doesn't work in this case, the text on the labels is too long!Jailhouse
I just saw your label "Disruptive behaviour can be contained and does not spread to other patients. Generally, behaviour on the ward is positive and pro-therapeutic." Are you sure that you cannot shorten this at all? I feel it is fairly hopeless to try reformat this to make it fit.Barbarous
Yes, it seems to me that the plot would be easier to read if the label read something like (Note 1) and (Note 2) on the lhs with a note or caption below/above the plot containing the long text.Leverrier

© 2022 - 2024 — McMap. All rights reserved.