遍历数据框列表以在R中创建图形

时间:2019-04-04 15:26:33

标签: r loops ggplot2 plot

我使用xyplot创建了一个晶格散点图,将其分为不同的类别。现在,我尝试为散点图中的每个类别创建一个hexplot。我可以对变量进行硬编码,但我希望循环执行,因为我会多次这样做,因此会产生新的类别。

我从一个看起来像这样的表开始

 Name     Category     Value1      Value2
sample1    cat1     10     1.5
sample2    cat2     10     1.5
sample3    cat3     10     1.5
sample4    cat1     10     1.5
sample5    cat1     10     1.5
sample6    cat2     10     1.5
sample7    cat3     10     1.5

我能够使用创建数据框列表

testing <- split(Mydata, Mydata$Category)

然后我可以创建一个图

testing2 <- as.data.frame(testing[["cat1"]]) #I keep on needing to change this for each Category that I have
ggplot(testing2, aes(x = testing2[,3], y = testing2[,4])) +
  geom_hex(bins = 30)

testing2看起来像这样

 Name     Category     Value1      Value2
sample1    cat1     10     1.5
sample4    cat1     10     1.5
sample5    cat1     10     1.5

我尝试了

for(i in testing){
  testing3 <- i
  xtra <- ggplot(testing3, aes(x = testing3[,3], y = testing3[,4])) + geom_hex(bins = 30)
  xtra
}

最后,xtra是列表中的最后一个数据框。

有人可以帮我吗?我希望能够创建图而不必每次都更改$ Category,因为我每次要执行> 50个类别。

-编辑1 根据建议,我创建了一个函数;

myFirstFun <- function(column)
{
  testing2 <- as.data.frame(testing[[column]])
  column <- enquo(column)
  ggplot(testing2, aes_string(x ="Value1", y = "Value2", group = column)) +
    geom_hex(bins = 30)
}

还有这个

myFirstFun("cat1")

产生这个;

 Name     Category     Value1      Value2
sample1    cat1     10     1.5
sample4    cat1     10     1.5
sample5    cat1     10     1.5

但是当我尝试使用for循环时;

for(i in categorynames){###categorynames is a vector that has all my categorynames
  myFirstFun(i)
}

它只会产生列表中的最后一个图形。 如何生成n个图形(n =我的类别数)? 没有我手动做

myFirstFun("cat1")
myFirstFun("cat2")
myFirstFun("cat3")
...

1 个答案:

答案 0 :(得分:2)

您可以构建一个函数,在其中使用dplyr::filter选择所需的Category然后进行绘制。

要遍历每个Category,请使用purrr::map并将所有结果存储在列表中。在这里,您可以打印所选的图,也可以将它们全部合并成一页,或者multiple pages

library(tidyverse)

df <- read.table(text = "Name     Category     Value1      Value2
sample1    cat1     11     2.5
sample2    cat2     13     1.5
sample3    cat3     12     3.5
sample4    cat1     15     6.5
sample5    cat1     17     4.5
sample6    cat2     14     7.5
sample7    cat3     16     1.5",
                 header = TRUE, stringsAsFactors = FALSE)

cat_chart1 <- function(data, category){

  df <- data %>% 
    filter(Category == category)

  plot1 <- ggplot(df, aes(x = Value1, y = Value2)) + 
    geom_hex(bins = 30)

  return(plot1)
}

# loop through all Categories
plot_list <- map(unique(df$Category), ~ cat_chart1(df, .x)) 
plot_list[[1]]                 

# combine all plots
library(cowplot)
plot_grid(plotlist = plot_list, ncol = 2)

reprex package(v0.2.1.9000)于2019-04-04创建