使用循环在一个页面中绘制多个图形

时间:2015-06-13 15:08:28

标签: r loops plot

我正在尝试在同一页面上绘制多个图表。当我像这样逐个编写代码时,它工作正常:

old.par <- par(mfrow = c(3,4))
plot(na.omit(AUS.Yield), xlab = "Date", ylab = "log_return", main = "AUS.Yield")
plot(na.omit(BRA.Yield), xlab = "Date", ylab = "log_return", main = "BRA.Yield")
plot(na.omit(CAN.Yield), xlab = "Date", ylab = "log_return", main = "CAN.Yield")
plot(na.omit(CHI.Yield), xlab = "Date", ylab = "log_return", main = "CHI.Yield")
plot(na.omit(GER.Yield), xlab = "Date", ylab = "log_return", main = "GER.Yield")
plot(na.omit(JAP.Yield), xlab = "Date", ylab = "log_return", main = "JAP.Yield")
plot(na.omit(SOA.Yield), xlab = "Date", ylab = "log_return", main = "SOA.Yield")
plot(na.omit(SWI.Yield), xlab = "Date", ylab = "log_return", main = "SWI.Yield")
plot(na.omit(UK.Yield), xlab = "Date", ylab = "log_return", main = "UK.Yield")
plot(na.omit(US.Yield), xlab = "Date", ylab = "log_return", main = "US.Yield")

但是当我尝试使用for循环时,它不起作用,例如:

## names(log_return[2:11]) will give me all those AUS.Yield, BRA.Yield etc as they are the column names of dataframe log_return

for (i in names(log_return[2:11]){
    plot(na.omit(i), xlab = "Date", ylab = "log_return", main = "i")
}

另外,我使用:

生成了10个时间序列
for (i in 2:length(log_return)){
  assign(names(log_return[i]),xts(log_return[i],log_return$Date))
}

所以我得到了10个时间序列,名称为:AUS.Yield,BRA.Yield ....等。

只是想知道哪里出错了...... 以下是错误消息:

 Error in plot.window(...) : need finite 'ylim' values 

我想也许我的数据框中有这么多的NA?但我已经使用了na.omit

这是datafram log_retrun;

的一小部分
      Date       AUS.Yield   BRA.Yield    CAN.Yield    CHI.Yield    GER.Yield   JAP.Yield
1 2008-01-01           NA          NA           NA           NA           NA        NA
2 2008-01-02           NA          NA           NA           NA           NA        NA
3 2008-01-03 -0.033047602 -0.01239795  0.003828977 -0.017857617 -0.031966192        NA
4 2008-01-04 -0.003922215  0.00198792 -0.008443187  0.006734032 -0.006984895        NA
5 2008-01-05           NA          NA           NA           NA           NA        NA
6 2008-01-06           NA          NA           NA           NA           NA        NA

JAP.Yield可能会查看所有NA,但是在几行之后会有值。

提前感谢您的任何帮助和建议!! T_T

2 个答案:

答案 0 :(得分:1)

您不需要持久创建xts个对象。请注意在names()规范中修改for()函数的使用:

for (i in names(log_return)[2:11]){
    plot(na.omit(xts(log_return[[i]],log_return$Date)), xlab = "Date", ylab = "log_return", main = i)
}

或者,正如@SpacedMan所提到的那样,如果你确实想要内存中的get()个对象,你可以使用xts来按名称引用变量:

for (i in names(log_return)[2:11]){
    plot(na.omit(get(i)), xlab = "Date", ylab = "log_return", main = i)
}

答案 1 :(得分:0)

事物的名称与事物本身不同。

字符串“foo”和对象foo是不同的东西。如果你plot("foo")它试图绘制字符串“foo”。如果您plot(foo),则绘制名为foo的对象。

那么,你在做什么:

for (i in names(log_return[2:11]){
    plot(na.omit(i), xlab = "Date", ylab = "log_return", main = "i")
}

names(something)将名称作为字符串返回。所以你正在做plot("AUS.yield"),它正在绘制字符串,而不是事物。

解决方案:最好不要使用assign创建名称。而是创建一个包含命名对象的列表。然后,您可以执行name="AUS.yield";data[[name]]之类的操作,以便从字符串中的名称中获取数据。

最糟糕的解决方案是使用get(name),它试图获取具有给定名称的东西(在你的情况下,类似plot(get(i))的东西应该这样做。这是“最差”的解决方案,因为它是一个小提琴撤消你原来犯的错误,当你应该在列表中构建它们时,按名称创建大量对象。