【问题标题】:Save ggplot objects in loop在循环中保存 ggplot 对象
【发布时间】:2017-05-20 07:12:38
【问题描述】:

如果问题很愚蠢,我是 R 新手,很抱歉,但我环顾四周找不到答案:

我有一个面板数据集,其中包含 25 家银行在 24 个月内的贷款数据。在这里,我制作了一个包含 3 个库和 3 个句点的更简单的版本:

bank<-c("bank1", "bank1", "bank1", "bank2", "bank2", "bank2",   "bank3", "bank3", "bank3")

date<-c("jan-2016", "feb-2016", "Mar-2016", "jan-2016", "feb-2016","Mar-2016", "jan-2016", "feb-2016", "Mar-2016")

tot_loans<-c(200000, 100000, 200000, 155000, 233000, 435000, 99000,   111000, 129000)

df<-data.frame(bank, date, tot_loans) 

我想创建一个循环来保存每个银行的 ggplot 对象。我的目标是稍后在降价文件中使用这些对象。我试试这个:

bank_list <- unique(df$bank)

 for (i in seq_along(bank_list)) { 
     paste(i, "total_loans", sep="_") <- df %>%
     group_by(date) %>%
     filter(bank==[[i]]) %>%
     ggplot(aes(x=date, y=loan_size)) +
          geom_line() +
          ggtitle(paste([[i]], "value of loans", sep=" "))
   }

但是这里有多个错误。我想得到的是一系列名为“bank1_total_loans”、“bank2_total_loans”等的 ggplot 对象,每个对象的银行名称为 ggplot 标题。 有没有办法做到这一点?

【问题讨论】:

    标签: r for-loop ggplot2


    【解决方案1】:
    library(tidyverse)
    library(ggplot2)
    bank<-c("bank1", "bank1", "bank1", "bank2", "bank2", "bank2",   "bank3", "bank3", "bank3")
    
    date<-c("jan-2016", "feb-2016", "Mar-2016", "jan-2016", "feb-2016","Mar-2016", "jan-2016", "feb-2016", "Mar-2016")
    
    tot_loans<-c(200000, 100000, 200000, 155000, 233000, 435000, 99000,   111000, 129000)
    
    df<-data.frame(bank, date, tot_loans) 
    
    
    plot_list <- df %>%
      split(.[["bank"]]) %>%
      map(~ggplot(data = ., aes(x=date, y=tot_loans)) +
            geom_line() +
            ggtitle(paste(.[1,1], "value of loans", sep=" "))
          )
    

    您可以使用map 函数避免循环。

    【讨论】:

    • 提示:如果您想了解map 系列函数的工作原理,请观看 Coursera.org 上的课程高级 R 编程
    【解决方案2】:
    library(ggplot2)
    

    library(dplyr)

    library(zoo)
    

    将日期变量转换为日期类以进行适当的可视化。

    df$date <- as.yearmon(as.character(df$date), "%b-%Y")
    df$date <- as.Date(df$date)
    
    ggplot_creater <- function(data, selector){
        m <- data %>% filter(bank %in% selector) %>%
        ggplot(aes(x=date, y=tot_loans, group=bank)) +
        theme_bw(base_size=14)+
        geom_line() +
        labs(x="Date", y="Total of Loans",
             title="Value of loans")+
        facet_wrap(~bank)
    }
    

    让我们看看它的效果如何:

    bank1_total_loans <- ggplot_creater(df, "bank1")
    bank1and3_total_loans <- ggplot_creater(df,c("bank1", "bank3"))
    

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2018-10-29
      • 2021-05-04
      相关资源
      最近更新 更多