我正在尝试在ggplot2中绘制一个时间序列。假设我使用以下数据结构(2500 x 20矩阵):
set.seed(21)
n <- 2500
x <- matrix(replicate(20,cumsum(sample(c(-1, 1), n, TRUE))),nrow = 2500,ncol=20)
aa <- x
rnames <- seq(as.Date("2010-01-01"), length=dim(aa)[1], by="1 month") - 1
rownames(aa) <- format(as.POSIXlt(rnames, format = "%Y-%m-%d"), format = "%d.%m.%Y")
colnames(aa) <- paste0("aa",1:k)
library("ggplot2")
library("reshape2")
library("scales")
aa <- melt(aa, id.vars = rownames(aa))
names(aa) <- c("time","id","value")
现在,以下用于绘制时间序列的命令产生了一个看起来很奇怪的x轴:
ggplot(aa, aes(x=time,y=value,colour=id,group=id)) +
geom_line()
我发现可以更改日期格式:
aa$time <- as.Date(aa$time, "%d.%m.%Y")
ggplot(aa, aes(x=time,y=value,colour=id,group=id)) +
geom_line()
这看起来更好,但仍然不是一个好的图形。我的问题特别是如何控制x轴的格式。是否必须采用Date
格式?在这两种情况下,如何控制显示的休息时间(即年数)?如果Date
不使用,这似乎是强制性的;否则,ggplot2会对中断使用某种有用的默认值。例如,以下命令不起作用:
aa$time <- as.Date(aa$time, "%d.%m.%Y")
ggplot(aa, aes(x=time,y=value,colour=id,group=id)) +
geom_line() +
scale_x_continuous(breaks=pretty_breaks(n=10))
另外,如果您有任何提示,也可以随意添加以改善图表的整体外观(例如,线条看起来有点不准确,恕我直言)。
您可以使用scale_x_date
@Gopala提及的格式设置日期。这是一个使用数据的简化版本进行说明的示例。
library(dplyr)
# Dates need to be in date format
aa$time <- as.Date(aa$time, "%d.%m.%Y")
# Shorten data to speed rendering
aa = aa %>% group_by(id) %>% slice(1:200)
在下面的代码中,我们使用来每六个月更新一次日期date_breaks="6 months"
。在这种情况下,这可能比您想要的要多,只是为了说明。如果你想确定哪个月获得突破(如扬/月,月/ 8等),那么你还需要使用coord_cartesian
和设置开始日期xlim
和expand=FALSE
使ggplot不会垫的开始日期。但是在设置时,您expand=FALSE
在y轴上也没有任何填充,因此您需要使用手动添加填充scale_y_continuous
(我希望能够expand
分别为x和y轴设置填充,但是AFAIK不可能)。因为这些中断紧密地包装在一起,所以我们使用一条theme
语句将标签旋转90度。
ggplot(aa, aes(x=time,y=value,colour=id,group=id)) +
geom_line(show.legend=FALSE) +
scale_y_continuous(limits=c(min(aa$value) - 2, max(aa$value) + 1)) +
scale_x_date(date_breaks="6 months",
labels=function(d) format(d, "%b %Y")) +
coord_cartesian(xlim=c(as.Date("2009-07-01"), max(aa$time) + 182),
expand=FALSE) +
theme_bw() +
theme(axis.text.x=element_text(angle=-90, vjust=0.5))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句