dan
dan

Reputation: 6314

Duplicated xtick labels in ggplot facets

I have this data.frame which I want to plot in facets using ggplot + facet_wrap:

set.seed(1)
df <- data.frame(val=rnorm(36),
                 gt=c(sapply(c("wt","pd","md","bd"),function(x) rep(x,9))),
                 ts=rep(c(sapply(c("cb","hp","ac"),function(x) rep(x,3))),4),
                 col=c(sapply(c("darkgray","darkblue","darkred","darkmagenta"),function(x) rep(x,9))),
                 index=rep(1:9,4),
                 stringsAsFactors=F)
df$xlab <- paste(df$ts,df$index,sep=".")
df$gt <- factor(df$gt,levels=c("wt","pd","md","bd"))

Here's how I'm trying to plot:

require(ggplot2)
ggplot(df,aes(x=index,y=val,color=gt))+geom_point(size=3)+facet_wrap(~gt,ncol=4)+
  scale_fill_manual(values=c("darkgray","darkblue","darkred","darkmagenta"),labels=levels(df$gt),name="gt",guide=F)+
  scale_colour_manual(values=c("darkgray","darkblue","darkred","darkmagenta"),labels=levels(df$gt),name="gt",guide=F)+
  labs(x="replicate",y="val")+scale_x_continuous(breaks=df$index,labels=df$xlab)+
  theme_bw()+theme(axis.text=element_text(size=6),axis.title=element_text(size=7),legend.text=element_text(size=6),legend.key=element_blank(),panel.border=element_blank(),strip.background=element_blank())

Which gives:

enter image description here

The problem is that the x0axis tick labels repeat themselves, sinceI'm calling scale_x_continuous. How do I get it right with facet_wrap?

Upvotes: 1

Views: 1675

Answers (1)

eipi10
eipi10

Reputation: 93811

Use the actual x-values in xlab as the x aesthetic, along with scales="free_x" in facet_wrap and delete the call to scale_x_continuous. Note, however, that the axis labels are still the same in each panel, because they are the same for each level of gt in the data.

ggplot(df,aes(x=xlab, y=val, color=gt)) + 
  geom_point(size=3, show.legend=FALSE) + 
  facet_wrap(~gt, ncol=4, scales="free_x") +
  # scale_fill_manual(values=c("darkgray","darkblue","darkred","darkmagenta"), labels=levels(df$gt), name="gt", guide=F) +
  scale_colour_manual(values=c("darkgray","darkblue","darkred","darkmagenta")) +
  labs(x="replicate", y="val") + 
  #scale_x_continuous(breaks=df$index, labels=df$xlab)+
  theme_bw() + 
  theme(axis.text=element_text(size=8),
        axis.title=element_text(size=7),
        legend.text=element_text(size=6),
        legend.key=element_blank(),
        panel.border=element_blank(),
        strip.background=element_blank())

enter image description here

Now let's change xlab, just to see how this works when different panels really do have different labels:

df$xlab[10:20] = LETTERS[1:11]

Now run the same plot code again to get the following:

enter image description here

One more contingency is the case where not all the panels have the same number of x-values. In that case, you can switch to facet_grid and add space="free_x" if you want the width of each panel to be proportional to the number of x-values in each panel.

ggplot(df[-c(1:5),], aes(x=xlab, y=val, color=gt)) + 
  geom_point(size=3, show.legend=FALSE) + 
  facet_grid(.~gt, space="free_x", scales="free_x") +
  scale_colour_manual(values=c("darkgray","darkblue","darkred","darkmagenta")) +
  labs(x="replicate", y="val") + 
  theme_bw() + 
  theme(axis.text=element_text(size=8),
        axis.title=element_text(size=7),
        legend.text=element_text(size=6),
        legend.key=element_blank(),
        panel.border=element_blank(),
        strip.background=element_blank())

enter image description here

A few other things:

  • You don't need to add color names to your data frame. If you want to change the default color, you can just set the them using one of the scale_colour_*** functions (as you did in your code).

  • For future reference this c(sapply(c("darkgray","darkblue","darkred","darkmagenta"),function(x) rep(x,9))) can be changed to this rep(c("darkgray","darkblue","darkred","darkmagenta"), each=9).

  • You can remove the scale_fill_manual line, as you don't have a fill aesthetic in your graph.

Upvotes: 1

Related Questions