将三个 ts 线生成两个具有共享 x 轴的堆叠图

问题描述 投票:0回答:2

我有三个时间序列变量。其中两个包含在我的文件中

roes.cvs
并使用以下代码绘制在一张图中:

roes <- read.csv(file="roes.csv", header=TRUE, sep=",")
roes.ts <- ts(roes, start = c(1984, 1), end = c(2020, 3), frequency = 4)
pdf("roes.pdf",height=5)
ts.plot(roes.ts, col=1:2, lty=1:2, xlim=c(1984, 2020), ylim=c(-10, 20), xlab = "")
dev.off()

产生:

最后一个包含在我的文件中

dsr.cvs
并使用以下代码单独绘制:

dsr <- read.csv(file="dsr.csv", header=TRUE, sep=",")
dsr.ts <- ts(dsr, start = c(1984, 1), end = c(2020, 3), frequency = 4)
pdf("dsr.pdf",height=5)
ts.plot(dsr.ts, col=1:2, lty=1:2, xlim=c(1984, 2020), ylim=c(5, 15), xlab = "")
dev.off()

产生:

现在,我希望将这两个图表与共享的 x 轴堆叠在一起,例如 this。但其中建议的解决方案使用

data.frame

我尝试自己生成代码但失败了。我希望获得帮助来生成正确的代码。

r plot
2个回答
1
投票

您可以将两个数据集绑定为一个,然后将其转换为

ts
对象。
ggfortify
包为
ts
中的
ggplot2
对象提供支持。

library(tidyverse)
library(ggfortify)

# Create data that is similiar to what yours should look like.
roes <- data.frame(roes1 = runif(36,-5, 15),
                   roes2 = runif(36, 6, 16))
head(roes)
#>       roes1     roes2
#> 1 11.610142 10.257512
#> 2  5.888285 14.721635
#> 3  7.618143  6.899824
#> 4  4.558857 12.344110
#> 5 13.606782 11.517959
#> 6  6.163015 10.885487

dsr <- data.frame(dsr1 = runif(36, 9, 13))
head(dsr)
#>        dsr1
#> 1 12.353777
#> 2  9.899284
#> 3 12.798054
#> 4 11.097071
#> 5 12.955612
#> 6  9.863011

# Bind data by the columns and turn in to ts object.
roes_dsr <-
  bind_cols(roes, dsr) |>
  ts(
    start = c(1984, 1),
    end = c(2020, 3),
    frequency = 4
  )

autoplot()
创建多面线图。

autoplot(roes_dsr)

您可以根据自己的喜好设定情节主题。

autoplot(roes_dsr) +
  theme_classic() +
  theme(
    strip.background = element_blank(),
    panel.spacing = unit(0, "lines"),
    panel.border = element_rect(color = "black", fill = NA)
  )

为了获得您指定的精确绘图,我们需要

pivot_longer()
数据 并编写
ggplot
代码 手动。幸运的是
ggfortify:::get.dtindex(roes_dsr)
有助于提取 来自
ts
对象的时间信息。

roes_dsr |> 
  as_tibble() |> 
  mutate(time = ggfortify:::get.dtindex(roes_dsr)) |> 
  pivot_longer(-time) |> 
  ggplot() +
  geom_line(aes(time, value)) +
  facet_wrap(
    vars(name),
    ncol = 1,
    scales = "free_y",
    strip.position = "left"
  ) +
  ylab("") +
  theme_classic() +
  theme(
    strip.background = element_blank(),
    strip.placement = "outside",
    panel.spacing = unit(0, "lines"),
    panel.border = element_rect(color = "black", fill = NA)
  )


0
投票

考虑保留基本 R 图形,使用各种

par
设置:

数据 (随机数据)

set.seed(20240112)
roes.ts <- ts(runif(435, min=-10, max=20), start = c(1984, 1), end = c(2020, 3), frequency = 4)
dsr.ts <- ts(runif(435, min=5, max=15), start = c(1984, 1), end = c(2020, 3), frequency = 4)

剧情

par(mfrow=c(2, 1))                     # SET PLOT REGION OF TWO ROWS BY ONE COLUMN
par(mar=c(0,3,2,0), xaxt="n", las=1)   # HIDE X-AXIS WITH ZERO BOTTOM MARGIN
ts.plot(roes.ts, col=1:2, lty=1:2, xlim=c(1984, 2020), ylim=c(-10, 20), ylab="roes.ts", xlab = "")
par(mar=c(2,3,0,0), xaxt="s", las=1)   # SHOW X-AXIS WITH NON-ZERO BOTTOM MARGIN
ts.plot(dsr.ts, col=1:2, lty=1:2, xlim=c(1984, 2020), ylim=c(5, 15), ylab="dsr.ts", xlab = "")

© www.soinside.com 2019 - 2024. All rights reserved.