【问题标题】:Plotting time series object绘制时间序列对象
【发布时间】:2014-11-07 18:14:18
【问题描述】:

我正在尝试绘制矩阵mx 的时间序列版本。我使用了以下代码,但是 x 轴没有显示我拥有的日期。它显示了一些数字,并没有真正追踪问题。

mx_ts<-ts(mx)
plot(mx_ts, type="l")

可重现的例子mx如下:

structure(c("0.233632449583826", "0.252105485477729", "0.591295809149662", 
"0.0901324567177099", "-0.0423290120373304", "0.0363874105632916", 
"-0.136952003053153", "0.451355935617868", "-0.291897852322839", 
"0.287789031880016", "-2.1", "-1.4", "-2.6", "1.9", "-0.7", "1.4", 
"-0.6", "-1.3", "-1.4", "0"), .Dim = c(10L, 2L), .Dimnames = list(
    c("1985-01", "1985-02", "1985-03", "1985-04", "1985-05", 
    "1985-06", "1985-07", "1985-08", "1985-09", "1985-10"), c("return", 
    "ukcc")))

【问题讨论】:

  • 请注意,df 是一个矩阵,而不是顾名思义的数据框。它还包含字符串,而不是数字。它最初的构建方式可能存在问题。
  • @G.Grothendieck 我已将所有df 更改为mx(在答案中也是如此)以免造成任何混淆。字符串是date 列,这在以后的每个分析中都会出现问题。尝试使用 as.Date 更改它,但没有成功。

标签: r plot time-series


【解决方案1】:

这里有几个其他选项:

library(zoo)
library(xts)

# Convert to time series object with dates by month
mx.ts = ts(mx, start=as.yearmon(rownames(mx)[1]), frequency=12)

# Plot with fractional years on x-axis
plot(mx.ts)

# Plot with month-year on x-axis
par(mfrow=c(2,1))
plot(as.xts(mx.ts[,"return"]), major.format="%b-%Y", cex.axis=0.7, main="Return")
plot(as.xts(mx.ts[,"ukcc"]), major.format="%b-%Y", cex.axis=0.7, main="ukcc")

而且总是有ggplot2 包:

library(reshape2)
library(ggplot2)

mx2 = cbind(Date=rownames(mx), mx)
names(mx2)=c("Date","Return","ukcc")

# Melt data into "long" format
mx2.m = melt(mx2, id.var="Date")

ggplot(mx2.m, aes(Date, value, group=variable, colour=variable)) +
  geom_line() + geom_point() +
  facet_grid(variable ~ ., scales="free_y")

【讨论】:

  • 相当全面的答案。一件事;运行ggplot 答案的最后一行时出现以下错误。 layout_base(data, rows, drop = drop) : At least one layer must contain all variables used for facetting中的错误
  • 这意味着您在facet_grid 中使用了一个在您的绘图数据框中找不到的变量名称。如果您在控制台中打印出df2.m,您会看到熔化df2 创建了一个名为variable 的新列,其中包含值Return 和ukcc。您需要在自己的数据中使用类似的列进行分面。 melt 默认将其称为 variable,但您可以将其设置为您喜欢的任何值。
  • 我只是使用上面的例子,所以没有任何改变。
  • 如果不查看数据框的结构和运行的确切绘图代码,很难判断发生了什么。只要您的数据框中有一个名为 variable 的列,就不会出现该错误。
  • 我有不同的名字; Date 列称为Var1,group 称为Var2,值称为value。当您将id.var 设置为"Date" 时,这非常令人惊讶。我在代码中更改了它们并且它可以工作,但是,它为Date 组以及ukcc 和Return 添加了另一个图。
【解决方案2】:

在这种情况下,zoo 类可能更可取:

library(zoo)
##
Dates <- as.Date(paste0(row.names(mx),"-01"))
mx_zoo <- zoo(apply(mx,2,as.numeric),Dates)
##
> plot(mx_zoo)

编辑: 这是使用@Henrik 的建议在 x 轴上获取年份信息的快速方法:

mx_zoo2 <- zoo(apply(mx,2,as.numeric),
               as.yearmon(Dates))
> plot(mx_zoo2)

如果你稍微玩一下axis,你可以调整轴标签,但老实说,我认为@eipi10 的回答很好地涵盖了这一点,所以我建议改用他的方法。

【讨论】:

  • 效果很好。我可以知道"-01" 是什么意思吗?另外,我怎样才能在 x 轴上获得年而不是月?
  • 你也可以使用order.by = as.yearmon(rownames(df))
  • “-01”将月份中的某天添加到每个日期,以便as.Date 可以正常工作。
  • 一旦你把它作为一个动物园对象,你也可以像这样在 ggplot2 中绘制它:library(ggplot2); autoplot(df_zoo) 或autoplot(df_zoo, facet = NULL) 假设Date 类索引。如果索引属于yearmon 类,则为library(scales); autoplot(df_zoo) + scale_x_yearmon()。
猜你喜欢
  • 2013-11-28
  • 2021-07-14
  • 2017-09-28
  • 2015-04-02
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多