我有三个时间序列变量。其中两个包含在我的文件中
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
。
我尝试自己生成代码但失败了。我希望获得帮助来生成正确的代码。
您可以将两个数据集绑定为一个,然后将其转换为
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)
)
考虑保留基本 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 = "")