首页 > 解决方案 > 在ggplot中循环对象

问题描述

我有多个相同格式的数据框,我想使用 ggplot 在同一个图中创建多条曲线。每个数据框都有一年的数据,从 1956 年到 2019 年。例如:

Year1956 <- data.frame(prob=c(5, 10, 20, 30, 100), Qmcs=c(1000, 500, 50, 10, 5))
Year1957 <- data.frame(prob=c(1, 3, 25, 35, 100), Qmcs=c(800, 600, 100, 50, 30))

可以手动在同一个图中绘制这些多个对象,其中 ... 将是 Year1958 到 Year2018

ggplot()+
  geom_line(data=Year1956, aes(x=prob, y=Qmcs))+
  geom_line(data=Year1957, aes(x=prob, y=Qmcs))+
  ...
  geom_line(data=Year2019, aes(x=prob, y=Qmcs))

由于有很多数据帧,有没有办法在循环中执行此操作?先感谢您。

标签: rdataframeloopsggplot2

解决方案


geom_line我的答案不是展示如何遍历数据帧列表以生成单独的geom_line.

假设我们有一系列带有"Year"+模式的 data.frames number

library(ggplot2)

Year1956 <- data.frame(prob=c(5, 10, 20, 30, 100), Qmcs=c(1000, 500, 50, 10, 5))
Year1957 <- data.frame(prob=c(1, 3, 25, 35, 100), Qmcs=c(800, 600, 100, 50, 30))

我们可以系统地收集所有满足模式的data.frames,通过循环和使用get()函数。

years <- c(1956:1957)

mylist <- lapply(setNames(nm = years), function(i) {
  get(paste0("Year", i), mode = "list")
})

最后,我们可以将所有这些 data.frames 组合在一起,并idcol使用data.table::rbindlist(). 然后绘制数据将很简单。

df <- data.table::rbindlist(mylist, idcol = "year")
df$year <- as.numeric(df$year)

ggplot(df, aes(prob, Qmcs, group = year)) +
  geom_line()

reprex 包于 2021-09-12 创建(v2.0.1)


推荐阅读