简体   繁体   中英

Subscript and width restrictions in x-axis tick labels in ggplot2

图。1

This is currently my code for the figure above

ggplot(AllData, aes(Year, AGResiduals, fill=Type)) + 
  geom_boxplot(outlier.size=0) + 
  scale_fill_manual(values=c("skyblue4", "skyblue"),
                    name="Male Type", 
                    labels=c("Guarders","Sneakers")) + 
  labs(x=NULL, y = "Residual of Accessory Gland Mass x Total Mass") +
  scale_x_discrete(limits=c("2007","2008","2010","2011","2013","2014","2015"), 
                   labels=str_wrap(c("2007 (nG=37, nS=8)","2008 (nG=4, nS=6)","2010 (nG=31, nS=6)","2011 (nG=55, nS=5)","2013 (nG=202, nS=24)","2014 (nG=63)","2015 (nG=59, nS=3)"),
                   width=6)) +
  theme(plot.title = element_text(size = rel(1.4)), 
        axis.title = element_text(size = rel(1.2)),
        axis.text.x = element_text(size = rel(1.5)),
        axis.text.y = element_text(size = rel(1.5)), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black"))

I want to make the "G" and "S"'s in each x-axis tick labels subscript (they designate sample size for two different groups, G and S).

Writing

expression(2007 (n[G]=37, n[S]=8)

works, but only if I remove the preceding

str_wrap

code for some reason.

I need to constrain the width of the text for each x-axis tick label, so I need to retain str_wrap or use line breaks within the expression function somehow.

I also can't replace my list of labels with a factor since I have to set limits on the years I want to show.

Can someone please help on how to make a 3-line x-axis tick label that allows for subscript?

I couldn't find a way to display expressions on multiple lines, but you could try rotating the labels:

library(stringr)
library(ggplot2)
library(scales)
library(dplyr)

n <- 100
y <- as.character(sample(2007:2015,n,replace=T))
t <- sample(c("Guarders","Guarders","Sneakers"),n,replace=T)
r <- rnorm(n,10,20)
nsk <- sum(t=="Sneakers")
r[ t=="Sneakers" ] <- rnorm(nsk,1,5)
AllData <- data.frame(Year=y,AGResiduals=r,Type=t)

sdf <- AllData %>% group_by( Year ) %>% 
                   summarize( n=n(), ng=sum(Type=="Guarders") ) 

fmts <- rep("%s (n[G]==%d) ~~ (n[S]==%d)",nrow(sdf))
labs2 <- do.call(sprintf,list(fmts,sdf$Year,sdf$ng, sdf$n-sdf$ng ) )

ex2 <- parse(text=labs2)

ggplot(AllData, aes(Year, AGResiduals, fill=Type)) + 
  geom_boxplot(outlier.size=0) + 
  scale_fill_manual(values=c("skyblue4", "skyblue"),
                    name="Male Type", 
                    labels=c("Guarders","Sneakers")) + 
  labs(x=NULL, y = "Residual of Accessory Gland Mass x Total Mass") +
  scale_x_discrete(limits=c("2007","2008","2010","2011","2013","2014","2015"), 
                   labels=ex2) +
  theme(plot.title = element_text(size = rel(1.4)), 
        axis.title = element_text(size = rel(1.2)),
        axis.text.x = element_text(size = rel(1.0),angle=-30,hjust=0),
        axis.text.y = element_text(size = rel(1.5)), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black"))

Yields this: 在此处输入图像描述

Rawr made a suggestion that allows you to get two, but not three lines. Since it doesn't require rotation, I am entering it as a second solution.

This:

library(stringr)
library(ggplot2)
library(scales)
library(dplyr)
set.seed(23456)
n <- 100
y <- as.character(sample(2007:2015,n,replace=T))
t <- sample(c("Guarders","Guarders","Sneakers"),n,replace=T)
r <- rnorm(n,10,20)
nsk <- sum(t=="Sneakers")
r[ t=="Sneakers" ] <- rnorm(nsk,1,5)
AllData <- data.frame(Year=y,AGResiduals=r,Type=t)

sdf <- AllData %>% group_by( Year ) %>% 
  summarize( n=n(), ng=sum(Type=="Guarders") ) 

 fmts <- rep("atop(%s, n[G]==%d ~~ n[S]==%d)",nrow(sdf)) # two rows
labs2 <- do.call(sprintf,list(fmts,sdf$Year,sdf$ng, sdf$n-sdf$ng ) )

ex2 <- parse(text=labs2)

ggplot(AllData, aes(Year, AGResiduals, fill=Type)) + 
  geom_boxplot(outlier.size=0) + 
  scale_fill_manual(values=c("skyblue4", "skyblue"),
                    name="Male Type", 
                    labels=c("Guarders","Sneakers")) + 
  labs(x=NULL, y = "Residual of Accessory Gland Mass x Total Mass") +
  scale_x_discrete(limits=c("2007","2008","2010","2011","2013","2014","2015"), 
                   labels=ex2) +
  theme(plot.title = element_text(size = rel(1.4)), 
        axis.title = element_text(size = rel(1.2)),
        axis.text.x = element_text(size = rel(1.0),angle=0,hjust=0),
        axis.text.y = element_text(size = rel(1.5)), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black"))

yields this: 在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM