【问题标题】:Plotting multiple graphs in one page using loop使用循环在一页中绘制多个图形
【发布时间】:2015-08-29 11:21:45
【问题描述】:

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

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

这是数据帧 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

【问题讨论】:

    标签: r loops plot


    【解决方案1】:

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

    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 提到的,如果您确实希望内存中的xts 对象,您也可以使用get() 在此处按名称引用变量:

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

    【讨论】:

    • 非常感谢!现在问题已经解决了。我想我需要更多关于基础知识的阅读,否则我会在那些字符串和名称上再次搞砸。
    【解决方案2】:

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

    字符串“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)) 之类的东西。这是“最糟糕”的解决方案,因为它是一个撤消错误的小提琴你最初所做的,当你应该在一个列表中构造它们时,按名称创建许多对象。

    【讨论】:

    • 感谢您的意见和建议!
    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 2018-03-16
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多