Modify x-axis labels in each facet

Solution 1:

With the same data I followed a four step approach.

First: subsetting the data

open <- subset(data1, Physicians_Out == "Open")
restr <- subset(data1, Physicians_Out == "Restricted")
closed <- subset(data1, Physicians_Out == "Closed")

Second: creating the labels for the different subsets

labs.open <- paste(gsub("/","-\n",names(table(open$Physicians_In)),fixed=T),
               "\n(N=",table(open$Physicians_In),")",sep="")
labs.restr <- paste(gsub("/","-\n",names(table(restr$Physicians_In)),fixed=T),
               "\n(N=",table(restr$Physicians_In),")",sep="")
labs.closed <- paste(gsub("/","-\n",names(table(closed$Physicians_In)),fixed=T),
               "\n(N=",table(closed$Physicians_In),")",sep="")

Third: creating a theme for removing the y-axis labels & text for the 2nd & 3rd sub-graphs

mytheme <- theme(
  axis.title.y = element_blank(),
  axis.text.y = element_blank(),
  axis.ticks.y = element_blank()
)

Finally: creating the graph

p1 <- ggplot(open,aes(x=Physicians_In,y=share,fill=Physicians_In)) +
  geom_boxplot() + stat_sum_single(mean) + 
  geom_jitter(position = position_jitter(width = .2),color="blue") +
  guides(fill=FALSE) +
  ggtitle(paste("Physician Access (Out): Open\nN = (", nrow(open), ")\n")) +
  scale_y_continuous("Gammagard Share",labels=percent) +
  scale_x_discrete("\nPhysician Access (In Hospital)",labels=labs.open) +
  theme_bw()

p2 <- ggplot(restr,aes(x=Physicians_In,y=share,fill=Physicians_In)) +
  geom_boxplot() + stat_sum_single(mean) + 
  geom_jitter(position = position_jitter(width = .2),color="blue") +
  guides(fill=FALSE) +
  ggtitle(paste("Physician Access (Out): Restricted\nN = (", nrow(restr), ")\n")) +
  scale_x_discrete("\nPhysician Access (In Hospital)",labels=labs.restr) +
  theme_bw() + mytheme

p3 <- ggplot(closed,aes(x=Physicians_In,y=share,fill=Physicians_In)) +
  geom_boxplot() + stat_sum_single(mean) + 
  geom_jitter(position = position_jitter(width = .2),color="blue") +
  guides(fill=FALSE) +
  ggtitle(paste("Physician Access (Out): Closed\nN = (", nrow(closed), ")\n")) +
  scale_x_discrete("\nPhysician Access (In Hospital)",labels=labs.closed) +
  theme_bw() + mytheme

library(gridExtra)

grid.arrange(p1, p2, p3, ncol=3)

Which gives the following result:

enter image description here

Solution 2:

It is not exactly what you want to do , but I think this can be helpful ( at least a good start)

library(ggplot2)
library(plyr)
data1 <- ddply(data1,.(Physicians_Out,Physicians_In),transform,label = length(share))
ggplot(data1,aes(x=Physicians_In,y=share,fill=Physicians_In))+ 
    geom_boxplot() + 
    stat_sum_single(mean) +
    facet_grid(.~Physicians_Out,labeller=label_both,scales='free_x') +
    stat_summary(fun.y=min,aes(label=paste0('N=',label)),geom='text',col='blue',cex=5)

enter image description here