ggplot facets中重复的xtick标签

时间:2016-11-21 00:16:48

标签: r ggplot2 facet-wrap

我想要使用data.frame + ggplotfacet_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"))

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

以下是我试图绘制的方式:

scale_x_continuous

给出了:

enter image description here

问题是x0axis刻度标签重复了,因为我正在调用facet_wrap。如何使用setDisplayHomeAsUpEnabled来解决问题?

1 个答案:

答案 0 :(得分:1)

xlab中的实际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美学。