如何随着时间的推移将变量绘制为rownames

时间:2016-05-21 13:41:54

标签: r plot ggplot2

我正在尝试在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)) 

此外,如果您有任何提示,如何改善图形的整体外观,请随意添加(例如,线条看起来有点不精确)。

1 个答案:

答案 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

enter image description here