【问题标题】:How to plot ts in multiple plots in R?如何在 R 中的多个图中绘制 ts?
【发布时间】:2019-12-09 17:02:11
【问题描述】:

我正在尝试掌握 R 中的绘图技巧,为此我使用以下代码一次生成各种时间序列图。

pl <- as.character()
for (k in (2:ncol(db))){
    h <- paste0("ts.plot(cbind(db[,1], y = db[,",k,"]), type = 'b', 
            gpars = list(col = c('black', 'red')), 
        main = 'copper & ",colnames(db[,k]),"');")      
    pl <- paste0(pl, h)
}
eval(parse(text=substr(pl, 1, (nchar(pl)-1))))

代码运行良好,但我无法理解:

  • 在这里,我一直在尝试将db[,1] 中的系列与所有其他系列进行对比。如何使用ts.plot 将它们绘制成两个单独的图?

  • 如何将美学从点更改为线?

我知道使用ggplot2 可以实现更好的图形集。但是,使用与ggplot2 相同的想法无法生成图表,要么没有,要么只有最后一个(也请查看我之前在此处发布的内容,如果您有更好的解决方案,请随时分享:Why is R function parse substituting semicolons with commas?

无论如何,如果有人可以帮助解决上述两个问题,我将非常高兴。

请使用此db 重现我的示例(任何时间序列都可以)

library(stats)
set.seed(1)
x <- stats::rnorm(n = 100, mean = 0, sd = 1)
y<- stats::rnorm(n = 100, mean = 1, sd = 1)
z <- stats::rnorm(n = 100, mean = 2, sd = 1)
u <- stats::rnorm(n = 100, mean = 3, sd = 1)
db <- cbind(x,y,z,u)

【问题讨论】:

  • 您能否提供一个可重复的示例来说明您要绘制的数据?见:stackoverflow.com/questions/5963269/…
  • 有趣的问题。但是为了提供帮助,如果您提供reproducible example,我们将非常高兴。如果你不能自己渲染,你也可以用图像软件勾勒出你想要的结果吗?
  • 谢谢@dc37,Parfait,我编辑为 db 添加了一些数据。事实上,我正在研究一些随机时间序列,所以任何浮点矩阵都可以正常工作

标签: r plot


【解决方案1】:

快速提问:parseeval 的使用是强制性的吗?在我的回答中,我没有使用它来简化代码。如果需要,您必须将其放回原处,但这应该很容易。

关于第二个问题,要使用lines 而不是points,您需要将type="b" 更改为type = "l"

那么,如果我理解正确,您愿意单独绘制每个时间序列,对吗?那么,每个情节都有一个时间系列吗?

为此,您可以使用par(mfrow 将绘图区域切割成多个部分。 由于ts.plot 需要绘制两次序列,您可以使用第一种颜色作为白色作弊,以免在每个图上绘制 db[,1]:

par(mfrow = c(ncol(db),1))
for(i in 1:ncol(db))
{
  ts.plot(cbind(db[,1], y = db[,i]), type= "l", gpars = list(col = c("white","red")), main = paste0("Copper & ",colnames(db)[i]))
}

如果您需要在每个对象上绘制 db[,1],您可以这样做:

par(mfrow = c(ncol(db)-1,1))
for(i in 2:ncol(db))
{
  ts.plot(cbind(db[,1], y = db[,i]), type= "l", gpars = list(col = c("black","red")), main = paste0("Copper & ",colnames(db)[i]))
}

你会得到:

ggplot2的使用

现在,要在 ggplot2 中获得相同的绘图,您必须重塑数据框以使其与 ggplot 语法兼容。您可以使用tidyverse 库来实现它:

library(tidyverse)
data.frame(db) %>% 
  mutate(Time = seq(1:100)) %>%
  pivot_longer(., -Time,names_to = "Variable", values_to = "Value") 

# A tibble: 400 x 3
    Time Variable   Value
   <int> <fct>      <dbl>
 1     1 x        -0.626 
 2     1 y         0.380 
 3     1 z         2.41  
 4     1 u         3.89  
 5     2 x         0.184 
 6     2 y         1.04  
 7     2 z         3.69  
 8     2 u         1.95  
 9     3 x        -0.836 
10     3 y         0.0891
# … with 390 more rows

所以,现在我们的数据集已准备好使用以下代码绘制:

data.frame(db) %>% 
  mutate(Time = seq(1:100)) %>%
  pivot_longer(., -Time,names_to = "Variable", values_to = "Value") %>%
  mutate(Variable = factor(Variable, levels = c("x","y","z","u")))%>%
  ggplot(., aes(x = Time, y = Value, color = Variable)) +
  geom_line() +
  facet_grid(rows = vars(Variable))
  facet_wrap(Variable~.)

要获得:

它回答了你的问题吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多