【问题标题】:How to plot a variable over time with time as rownames如何随着时间的推移绘制变量作为行名
【发布时间】:2016-05-22 01:48:04
【问题描述】:

我正在尝试在 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_date 并在其中scale_x_date 也许?
  • @Gopala 你什么意思?我在上面提供了MWE?首先,如果我使用ggplot(aa, aes(x=time,y=value,colour=id,group=id)) + geom_line(),则轴根本不会显示任何中断,即没有日期格式。我想知道如何正确控制 x 轴,在我没有时间但有另一个变量的情况下也是如此。但是我认为对于这种特殊情况,使用日期格式最容易。
  • 对不起,我不是说你没有提供。您的问题/问题似乎比您提供的代码简单得多。我在想一个更小的例子就足够了。是的,在这里处理日期和使用scale_date 似乎是件好事。

标签: r plot ggplot2


【解决方案1】:

您可以使用@Gopala 提到的scale_x_date 格式化日期。这是一个使用缩短版本的数据进行说明的示例。

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" 获取日期中断。在这种情况下,这可能比你想要的更多,只是为了说明。如果您想确定休息的月份(例如,一月/七月、二月/八月等),那么您还需要使用 coord_cartesian 并使用 xlimexpand=FALSE 设置开始日期,这样 ggplot 就赢了不要填写开始日期。但是,当您设置 expand=FALSE 时,您也不会在 y 轴上获得任何填充,因此您需要使用 scale_y_continuous 手动添加填充(我希望能够为 x 单独设置 expand和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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多