2016-11-21 83 views
0

我一直在使用ggplot + facet_wrap这个data.frame,我想在面绘制方面:重复的XTICK标签

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

这里是我怎样,我想要绘制:

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

其中给出:

enter image description here

问题是x0轴滴答标签重复自己,因为我打电话给scale_x_continuous。我如何通过facet_wrap解决问题?

回答

1

使用xlab中的实际x值作为x美学值,以及scales="free_x",facet_wrap并删除对scale_x_continuous的调用。但请注意,每个面板中的轴标签仍然相同,因为它们对于数据中的每个级别gt都是相同的。

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

现在,让我们改变xlab,正好看到这是如何工作时,不同的面板确实有不同的标签:

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

现在再次运行同积代码来获取以下:

enter image description here

另一个偶然事件是,并非所有面板都具有相同数量的x值。在这种情况下,如果您希望每个面板的宽度与每个面板中x值的数量成比例,则可以切换到facet_grid并添加space="free_x"

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

一些其他的东西:

  • 你并不需要的颜色名称添加到您的数据帧。如果您想更改默认颜色,您可以使用scale_colour_***函数之一来设置它们(如您在代码中所做的那样)。

  • 以供将来参考此c(sapply(c("darkgray","darkblue","darkred","darkmagenta"),function(x) rep(x,9)))可以改变此rep(c("darkgray","darkblue","darkred","darkmagenta"), each=9)

  • 您可以删除scale_fill_manual行,因为您的图形中没有fill美学。