从具有数据框的嵌套列表中绘制ggplot

时间:2019-08-28 18:31:56

标签: r ggplot2 dplyr purrr

这是我的数据框

df <- tibble("Fruit_Name" = c("Banana", "Apple", "Orange", "Peach", "Pear", "Watermelon"), "Code" = c(1,1,2, 2,3, 3), "Share_2002" = c(0.116, 3.442, 2.445, 1.932, 0.985, 0.321), "Share_2010" = c(1.4, 2.8, 2.4, 2.10, 0.99, 1.04), "Share_2018" = c(0.161, 0.232, 1.234, 0.456, 0.089, 0.06), "Share_2018_bis" = c(0.5, 0.34, 1.5, 1.2, 0.75, 1.8))

从这个初始数据帧中,我构建了一个嵌套列表:

    fruits <- df %>%
  rename("2002" = Share_2002,
         "2010" = Share_2010,
         "2018" = Share_2018,
         "2018bis" = Share_2018_bis) %>%
  arrange(Code)%>%
  group_split(Code) %>%
  map(~list(fruit_normal = .x, fruit_long = .x %>%
                            gather(Year, Share, c(3,4,5), -Code, -Fruit_Name) %>%
                            arrange(Fruit_Name) %>%
                            mutate_all(funs(str_replace(., "2018bis", "2018"))),
            fruits2 = .x %>%
              gather(Year, Share, c(3,4,6), -Code, -Fruit_Name) %>%
              arrange(Fruit_Name) %>%
              mutate_all(funs(str_replace(., "2018bis", "2018")))))

我想像这样或多或少有一个图

ggplot(x, aes(x = Year, y = Share, color = Fruit_Name)) + 
geom_line(size = 2) + 
facet_grid(Fruit_Name~ .)

这使我可以为每个代码组中的每个水果创建一个图,其中x轴为Year,y轴为Share。

我很难为ggplot指定每个嵌套的数据帧! 我不想从列表中构造一个数据框,但是尝试访问现有的数据框。

我尝试过这样的事情:

myplot <- function(x){ggplot(x, aes(x = Year, y = Share, color = Fruit_Name)) + 
geom_line(size = 2) + 
facet_grid(Code~ .)}

i <- c(1,2,3)
for (x in i){
  lapply(fruits[["i"]], map_depth(x, 2, myplot(fruits2)))
}

但是它不起作用,因为在任何情况下,ggplot都需要一个数据框作为参数而不是列表!!

谢谢

1 个答案:

答案 0 :(得分:1)

我认为您的示例数据中有一个错字,因为您没有像其他人一样重命名Share_2010,所以我从

开始
fruits <- df %>%
  rename("2002" = Share_2002,
         "2010" = Share_2010,
         "2018" = Share_2018,
         "2018bis" = Share_2018_bis) %>%
  arrange(Code)%>%
  group_split(Code) %>%
  map(~list(fruit_normal = .x, fruit_long = .x %>%
                            gather(Year, Share, c(3,4,5), -Code, -Fruit_Name) %>%
                            arrange(Fruit_Name) %>%
                            mutate_all(funs(str_replace(., "2018bis", "2018"))),
            fruits2 = .x %>%
              gather(Year, Share, c(3,4,6), -Code, -Fruit_Name) %>%
              arrange(Fruit_Name) %>%
              mutate_all(funs(str_replace(., "2018bis", "2018")))))

然后在绘图代码中添加分组美感并使其具有功能

plotFruit <- function(df) {
    ggplot(df, aes(group = Fruit_Name, x = Year, y = Share, color = Fruit_Name)) + 
        geom_line(size = 2) + 
        facet_grid(Fruit_Name~ .)}

并使用

解压缩此庞大的数据结构
map(fruits, pluck, "fruit_long") %>% map(plotFruit)

map(fruits, pluck, "fruits2") %>% map(plotFruit)

这是您要找的吗?