我正在尝试在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))
此外,如果您有任何提示,如何改善图形的整体外观,请随意添加(例如,线条看起来有点不精确)。
答案 0 :(得分:1)
您可以使用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"
每六个月获得一次日期。在这种情况下,这可能比您想要的更多休息,仅用于说明。如果您想确定哪些月份获得休息时间(例如,1月/ 7月,2月/ 8月等),那么您还需要使用coord_cartesian
并将开始日期设置为xlim
和{{1所以ggplot不会填补开始日期。但是当您设置expand=FALSE
时,您也不会在y轴上获得任何填充,因此您需要使用expand=FALSE
手动添加填充(我希望能够分别为x和y轴设置scale_y_continuous
,但AFAIK不可能)。由于断点紧密排列,我们使用expand
语句将标签旋转90度。
theme