这是我目前的史诗:
以及用于生成它的代码:
# 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看起来像:
我的x轴有两个问题:
问题1 - 中断
问题2 - 主要和次要刻度标签
2.1有没有办法让缩写的日期名称为90度角,并将日期编号和月份编号保持在0度。
2.2是否有任何方法只显示一个月的数字(最好以月中为中心),这样就不会像上面的例子那样在每个主要的刻度标签上重复。
答案 0 :(得分:2)
这会让你更进一步(我没有添加线条),但这是非常手工的工作。
在主图中,我:
然后我:
annotation_custom
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)