在单页上放置多个ggplot图时,日期标签会重叠

时间:2010-07-13 21:55:23

标签: r ggplot2

我试图使用gridExtra包的arrange()函数在页面上放置多个ggplot2时间序列图。不幸的是,我发现x轴标签被推到了一起;虽然我的图表只占用了1/4的页面,但该图表似乎将相同数量的x轴标签作为整页图表。有一个更好的方法吗?我宁愿不必手动设置任何点,因为我将处理大量跨越不同日期范围并具有不同频率的图表。

以下是一些复制问题的示例代码。

dfm <- data.frame(index=seq(from=as.Date("2000-01-01"), length.out=100, by="year"), 
    x1=rnorm(100), 
    x2=rnorm(100))
mydata <- melt(dfm, id="index")

pdf("test.pdf")
plot1 <- ggplot(mydata, aes(index, value, color=variable))+geom_line()
plot2 <- ggplot(mydata, aes(index, value, color=variable))+geom_line()
plot3 <- ggplot(mydata, aes(index, value, color=variable))+geom_line()
plot4 <- ggplot(mydata, aes(index, value, color=variable))+geom_line()
arrange(plot1, plot2, plot3, plot4, ncol=2, nrow=2)
dev.off()

2 个答案:

答案 0 :(得分:5)

旋转轴标签

+ opts(axis.text.x=theme_text(angle=45, hjust=1))

请注意, ggplot2 的当前版本中不推荐使用opts。此功能已移至theme()

+ theme(axis.text.x = element_text(angle = 45, hjust = 1))

或稀释x轴

+scale_x_datetime(major = "10 years")

自动移动标签,我认为arrange()函数需要摆弄(虽然我不知道如何)。

答案 1 :(得分:3)

我写了这个函数来返回正确的主轴断点,因为你需要一些固定的主要断点。

year.range.major <- function(df, column = "index", n = 5){
  range <- diff(range(df[,column]))
  range.num <- as.numeric(range)
  major = max(pretty((range.num/365)/n))

  return(paste(major,"years"))
}

因此,不是总是将休息时间固定在10年,而是以很短的间隔产生固定数量的休息时间。

+scale_x_date(major = year.range.major())

+scale_x_date(major = year.range.major(n=3))