【发布时间】:2012-11-08 22:03:30
【问题描述】:
我一直在尝试在图表的 x 轴上添加适当的日期,但无法弄清楚如何以理智的方式进行操作。我想要的非常简单:每年 1 月 1 日的日期介于我的数据集的最小值和最大值之间。
我不想包括月份 - 只是 '2008' 或 '2009' 或任何可以的。下图就是一个很好的例子:
除了我想要每年的日期,而不是每隔一年。
我似乎无法弄清楚这一点。我的日期定义为自 1970 年 1 月 1 日以来的天数,并且我包含了一个方法 dateEPOCH_formatter,它使用 chron 包将纪元格式转换为格式。我已经想出了如何在图表的原点以及之后每 365 天制作一个刻度线和日期,但这并不完全相同。
另一个小问题是,神秘地,chron(floor(y), out.format="mon year",origin.=epoch) 行输出了一个带有轴标记的图形,例如“2008 年 3 月”,但是将行更改为 chron(floor(y), out.format="year",origin.=epoch) 并没有给我像“2008”这样的结果 - 它只是导致错误:
Error in parse.format(format[1]) : unrecognized format year
Calls: print ... as.character.times -> format -> format.dates -> parse.format
Execution halted
这是我的代码 - 感谢您的帮助。
library(ggplot2)
library(chron)
argv <- commandArgs(trailingOnly = TRUE)
mydata = read.csv(argv[1])
png(argv[2], height=300, width=470)
timeHMS_formatter <- function(x) { # Takes time in seconds from midnight, converts to HH:MM:SS
h <- floor(x/3600)
m <- floor(x %% 60)
s <- round(60*(x %% 1)) # Round to nearest second
lab <- sprintf('%02d:%02d', h, m, s) # Format the strings as HH:MM:SS
lab <- gsub('^00:', '', lab) # Remove leading 00: if present
lab <- gsub('^0', '', lab) # Remove leading 0 if present
}
dateEPOCH_formatter <- function (y){
epoch <- c(month=1,day=1,year=1970)
chron(floor(y), out.format="mon year",origin.=epoch)
}
p= ggplot() +
coord_cartesian(xlim=c(min(mydata$day),max(mydata$day)), ylim=c(0,86400)) + # displays data from first email through present
scale_color_hue() +
xlab("Date") +
ylab("Time of Day") +
scale_y_continuous(label=timeHMS_formatter, breaks=seq(0, 86400, 14400)) + # adds tick marks every 4 hours
scale_x_continuous(label=dateEPOCH_formatter, breaks=seq(min(mydata$day), max(mydata$day), 365) ) +
ggtitle("Email Sending Times") + # adds graph title
theme( legend.position = "none", axis.title.x = element_text(vjust=-0.3)) +
theme_bw() +
layer(
data=mydata,
mapping=aes(x=mydata$day, y=mydata$seconds),
stat="identity",
stat_params=list(),
geom="point",
geom_params=list(alpha=5/8, size=2, color="#A9203E"),
position=position_identity(),
)
print(p)
dev.off()
【问题讨论】:
-
如果您包含一些示例数据(使用
dput或类似数据),这和您之前的问题将会得到改善。我认为使用与ggplot2关联的scales库中的scale_x_date和date_breaks会更容易
标签: r date ggplot2 epoch chron