我有一个 4 种不同矩阵长度的列表。我希望将它们绘制为一组时间序列,如下例所示,只是 x 轴是一个连续数字(例如 1:75
),y 轴是矩阵值(例如 罪恶(1:75)
)。
(https://homepage.divms.uiowa.edu/~luke/classes/STAT4580/timeseries_files/figure-html/unnamed-chunk-39-2.png)。
我知道 ggplot2 不处理列表,所以知道如何推进吗?
脚本:
mat1 <- matrix(cos(1:50), nrow = 50, ncol = 1)
mat2 <- matrix(sin(1:75), nrow = 75, ncol = 1)
mat3 <- matrix(tan(1:50), nrow = 50, ncol = 1)
mat4 <- matrix(1:100, nrow = 100, ncol = 1)
myList <- list(mat1, mat2, mat3, mat4)
names(myList)[1] <- "mat1"
names(myList)[2] <- "mat2"
names(myList)[3] <- "mat3"
names(myList)[4] <- "mat4"
最佳答案
是这样的吗?
library(tidyverse)
map_dfr(myList, ~as.data.frame(.x), .id = "id") %>%
group_by(id) %>%
mutate(n = 1:n()) %>%
ungroup() %>%
mutate(id = as.factor(id)) %>%
ggplot(aes(n, V1, colour = id)) +
geom_line() +
facet_wrap(~ id, scales = "free")
说明:我们首先将所有矩阵转换为 data.frame
并将所有行绑定(bind)到一个包含 id
的 data.frame
源自 list
名称;然后我们可以按 id
对行进行编号,然后绘制行号与单列的对比图。
这里是相同的代码“un-piped”和“uglified”
library(tidyverse)
# Convert from list of matrices to long data.frame
df.long <- map_dfr(myList, ~as.data.frame(.x), .id = "id")
# Group by id
df.long <- group_by(df.long, id)
# Add row number (per group)
df.long <- mutate(df.long, n = 1:n())
# ungroup
df.long <- ungroup(df.long)
# Make sure id is a factor
df.long <- mutate(df.long, id = as.factor(id))
# (gg)plot
ggplot(df.long, aes(n, V1, colour = id)) +
geom_line() +
facet_wrap(~ id, scales = "free")
很容易看出 %>%
如何获取左边的对象并将其用作右边函数的第一个参数;所以 f(x)
会变成 x %>% f()
。
关于r - 使用 ggplot2 从列表中绘制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54507268/