在ggplot中循环对象

Posted

技术标签:

【中文标题】在ggplot中循环对象【英文标题】:Loop over objects in ggplot 【发布时间】:2021-11-08 06:00:05 【问题描述】:

我有多个相同格式的数据框,我想使用 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))

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

【问题讨论】:

【参考方案1】:

我的回答不是展示如何遍历数据帧列表以生成单独的geom_line,而是展示如何组合类似结构化的 data.frames 并在单个 geom_line 中完成所有操作。

假设我们有一系列数据帧,其模式为"Year" + 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))

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

years <- c(1956:1957)

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

最后,我们可以将所有这些 data.frame 组合在一起,并通过使用 data.table::rbindlist() 中的 idcol 参数来跟踪我们的年份。然后绘制数据将很简单。

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

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

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

【讨论】:

以上是关于在ggplot中循环对象的主要内容,如果未能解决你的问题,请参考以下文章

在ggplot中循环变量

带有 ggplots 的 for 循环生成具有相同值但标题不同的图形

使用 ggplot 循环

"for" 循环只添加最后的 ggplot 层

如何在 ggplot 中制作循环的、类似甜甜圈的颜色图例?

使用循环在 ggplot 中创建具有不同 Y 轴值的多个图