X轴主要和次要刻度日期标签和中断(epicurve)

时间:2014-09-30 10:52:11

标签: r date ggplot2

这是我目前的史诗:

enter image description here

以及用于生成它的代码:

# generate random sample of dates and sex
df = data.frame(dates = Sys.Date() + sample(-10:25, 100, replace = T), 
            sex = sample(c("M", "F"), 25, replace = T)) 

require(ggplot2); require(scales)

# set x-axis limits 
xlmts = c(Sys.Date() - 22, Sys.Date() + 30)

p = ggplot(df, aes(x = dates, fill  = sex))

p = p + geom_bar(stat = "bin", colour = "black")

p = p + scale_x_date(breaks = "1 day", labels=date_format("%a \n %d \n %m"),
                 limits = xlmts)

p

这大致是我希望我的epicruve看起来像:

enter image description here

我的x轴有两个问题:

问题1 - 中断

  1. 即使我已经设定了'休息= 1天'在' scale_x_date'多天已归为一类
  2. 问题2 - 主要和次要刻度标签

    2.1有没有办法让缩写的日期名称为90度角,并将日期编号和月份编号保持在0度。

    2.2是否有任何方法只显示一个月的数字(最好以月中为中心),这样就不会像上面的例子那样在每个主要的刻度标签上重复。

1 个答案:

答案 0 :(得分:2)

这会让你更进一步(我没有添加线条),但这是非常手工的工作。

在主图中,我:

  • 使用随机种子使其可重现: - )
  • 预先计算每日的M / F计数
  • 旋转X轴标签(仅使用日期短名称)
  • 展开绘图边距以适应额外的X轴注释

然后我:

  • 通过annotation_custom
  • 生成并添加未轮播的月中#s日
  • 通过annotation_custom
  • 生成并添加未轮换的月份数字
  • 构建最终的地块网格结构
  • 关闭面板夹矩形
  • 使用grid.draw
  • 绘制图表

你会想要稍微调整间距。

这应该足以让你前进(并且使用lineGrob添加行应该非常可行。)

library(dplyr)
library(ggplot2)
library(scales)
library(grid)
library(gridExtra)

set.seed(1492) # reproducible

df = data.frame(dates = Sys.Date() + sample(-10:25, 100, replace = T), 
                sex = sample(c("M", "F"), 25, replace = T)) 

# pre-compute the M/F counts per date

df.2 <- df %>% group_by(dates, sex) %>% summarise(count=n())

gg <- ggplot(df.2, aes(x=dates, y=count, fill=sex))
gg <- gg + geom_bar(color="black", position="stack", stat="identity")
gg <- gg + scale_x_date(breaks="1 day", 
                        labels=date_format("%a"),
                        limits = xlmts)
gg <- gg + labs(x=NULL)
gg <- gg + theme_bw()
gg <- gg + theme(axis.text.x=element_text(angle = 90, hjust = 1))
gg <- gg + theme(plot.margin=unit(c(1,1,5,1), "line"))

gg1 <- gg # keep base plot

# make & plot the day #'s

for (d in seq(from=as.Date("2014-09-06"), to=as.Date("2014-11-01"), by="1 day")) {
  d1 <- format(as.Date(d, origin="1970-01-01"), "%d")
  gg1 <- gg1 + annotation_custom(grob=textGrob(d1, hjust=0, gp=gpar(cex=0.7)), ymin=-0.8, ymax=-0.8, 
                                 xmin=as.numeric(d), xmax=as.numeric(d))  
}

# add month numbners

gg1 <- gg1 + annotation_custom(grob=textGrob("9", gp=gpar(cex=0.8)), ymin=-1.0, ymax=-1.0, 
                            xmin=as.numeric(as.Date("2014-09-17")), xmax=as.numeric(as.Date("2014-09-17")))
gg1 <- gg1 + annotation_custom(grob=textGrob("10", gp=gpar(cex=0.8)), ymin=-1.0, ymax=-1.0, 
                            xmin=as.numeric(as.Date("2014-10-12")), xmax=as.numeric(as.Date("2014-10-12")))

# build the plot

gg2 <- ggplot_gtable(ggplot_build(gg1))

# no panel clipping
gg2$layout$clip[gg2$layout$name=="panel"] <- "off"

# draw the plot 

grid.draw(gg2)

enter image description here