为各种data.frames创建相同的绘图

为各种data.frames创建相同的绘图,r,ggplot2,foreach,R,Ggplot2,Foreach,我有三个不同的数据框架(GRCYPT_流量、ESIEIT_流量、GRCYPT_流量),它们包含相同的变量(报告流量、合作伙伴流量、指标、年份、值),但具有不同的级别/观察值。现在我想为每个data.frames创建绘图。因为这些图应该看起来是一样的,所以我似乎有理由使用一个迭代命令。我尝试了foreach循环: foreach(i=GRCYPT_flows, ESIEIT_flows, GRCYPT_flows) %do% { ggplot(i, aes(year, value)) + ge

我有三个不同的数据框架(GRCYPT_流量、ESIEIT_流量、GRCYPT_流量),它们包含相同的变量(报告流量、合作伙伴流量、指标、年份、值),但具有不同的级别/观察值。现在我想为每个data.frames创建绘图。因为这些图应该看起来是一样的,所以我似乎有理由使用一个迭代命令。我尝试了foreach循环:

foreach(i=GRCYPT_flows, ESIEIT_flows, GRCYPT_flows) %do% {  ggplot(i, aes(year, value)) + 
geom_line(aes(colour=partner_ctry, linetype=indicator)) + facet_wrap(~report_ctry) +
theme(axis.text.x=element_text(angle=90, vjust=0.5)) + 
scale_x_continuous(breaks=seq(2002, 2012, 2), name="") +
scale_y_continuous(name="Billion Euros") + 
scale_colour_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("EA17", "Extra-EA17")) +
scale_linetype_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("Trade", "Capital")) +
theme(legend.title=element_blank())}
该代码实际上不起作用。我在这里面临的问题是:

  • 将data.frame分配给迭代变量

  • 告诉foreach循环将每个迭代保存到具有不同名称的不同列表(plot1、plot2、plot3等)

  • 我相对确定,如果你对R有一些经验,这是很容易解决的。然而,我是一个完全的新手,所以我真的不知道从哪里开始(我可以很容易地用Stata来解决,我至少有一些经验)


    我想做的是告诉R:“为每个data.frames绘制一个图,并将每个图保存在一个单独的列表中。”

    这里有一个iris的三个data.frames的示例,为了简单起见,我将其命名为i1、i2和i3

    i2 <- i3 <- i1 <- iris
    
    foreach(m = 1:3) %do% {
      dat <- paste0("i" , m) %>% get
      ggplot(dat, aes(Sepal.Length, Petal.Length)) + geom_line()
    }
    
    我认为这里最“R”-y的解决方案是lappy。Lapply获取事物的向量,对所有事物执行相同的操作,然后将输出存储为列表。因为您使用的是ggplot,所以您可能希望所有类似的绘图都有一个组织整齐的列表

    首先将数据帧组织在一个列表中

    my_data  <- list(GRCYPT_flows, ESIEIT_flows) 
    
    这将获取列表中的每个元素(“i”)并对其执行自定义函数,其中自定义函数是您精心绘制的图

    由于使用的是ggplot,因此可以将这些绘图存储为输出。因此,我的_图将是一个包含所有图的整洁列表

    因此,使用完整的绘图功能,请尝试:

        my_plot <- lapply(my_data, function(i) {
    ggplot(i, aes(year, value)) + 
    geom_line(aes(colour=partner_ctry, linetype=indicator)) + facet_wrap(~report_ctry) +
    theme(axis.text.x=element_text(angle=90, vjust=0.5)) + 
    scale_x_continuous(breaks=seq(2002, 2012, 2), name="") +
    scale_y_continuous(name="Billion Euros") + 
    scale_colour_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("EA17", "Extra-EA17")) +
    scale_linetype_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("Trade", "Capital")) +
    theme(legend.title=element_blank())
    })
    

    my_plot我建议将绘图代码从循环中分离出来,这样您就可以在一个示例上测试它,然后轻松地为批处理运行它。您可能希望将批处理保存到文件中

    library(tidyverse)
    
    myplot <- function(df, filename = NULL) {
      df %>%
        ggplot(aes(Sepal.Length, Petal.Length)) +
        geom_point() ->
        result
    
      if(!is.null(filename)) ggsave(filename, plot = result, width = 6, height = 4)
      else result
    }
    
    # test the plot
    myplot(iris)
    
    # do the batch
    l <- list(one = iris, two = iris)
    l %>% names %>% walk(function(n) myplot(l[[n]], paste0(n, ".pdf")))
    
    库(tidyverse)
    myplot%
    ggplot(aes(萼片长度、花瓣长度))+
    几何点()->
    后果
    如果(!is.null(filename))ggsave(filename,plot=result,width=6,height=4)
    其他结果
    }
    #测试情节
    myplot(虹膜)
    #批量生产
    l%names%>%walk(函数(n)myplot(l[[n]],粘贴0(n,.pdf”))
    
    您想使用
    foreach
    而不是简单的
    for
    (或list+lappy)有什么原因吗也许您可以将data.frames的字符名列表传递给
    foreach
    ,然后使用
    get
    获取实际的data.frame。您可以使用
    foreach
    infrastructure(例如,请参阅)返回列表。@docendodiscimus也许OP可以在某个时候升级以使用并行后端。@docendo discimus:好吧,我愿意接受任何可行的建议。它不一定必须是foreach循环。正如我所说的,我对R完全陌生,不知道有多少命令。这确实有效,但它并不能完全产生我所需要的,因为我希望R将每个绘图存储在一个单独的列表中。在这里,所有绘图都存储在
    my\u plot
    中。另外,当我试图保存我的绘图时,我得到一个错误消息,msg
    没有适用于“list”类对象的“grid.draw”方法。
    
        my_plot <- lapply(my_data, function(i) {
    ggplot(i, aes(year, value)) + 
    geom_line(aes(colour=partner_ctry, linetype=indicator)) + facet_wrap(~report_ctry) +
    theme(axis.text.x=element_text(angle=90, vjust=0.5)) + 
    scale_x_continuous(breaks=seq(2002, 2012, 2), name="") +
    scale_y_continuous(name="Billion Euros") + 
    scale_colour_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("EA17", "Extra-EA17")) +
    scale_linetype_discrete(breaks=c("EA17", "ROW_NON_EA17"), labels=c("Trade", "Capital")) +
    theme(legend.title=element_blank())
    })
    
    library(tidyverse)
    
    myplot <- function(df, filename = NULL) {
      df %>%
        ggplot(aes(Sepal.Length, Petal.Length)) +
        geom_point() ->
        result
    
      if(!is.null(filename)) ggsave(filename, plot = result, width = 6, height = 4)
      else result
    }
    
    # test the plot
    myplot(iris)
    
    # do the batch
    l <- list(one = iris, two = iris)
    l %>% names %>% walk(function(n) myplot(l[[n]], paste0(n, ".pdf")))