【问题标题】:ggplot inside for loopggplot里面的for循环
【发布时间】:2019-04-22 22:15:32
【问题描述】:

我想遍历六个相似的数据框并使用 ggplot 打印出六个图。

我的代码在我单独运行绘图时有效,但我无法使用 for 循环让 ggplot 运行六次。我的六个数据框是 gg_pets 中列出的六种动物。

cat <- data.frame(Breed = c("American Shorthair","Ragdoll","Persian","Sphynx","Maine Coon"), 
Longevity = c("17","19","15","17","20"))

dog <- data.frame(Breed = c("Havanese","Bulldog","Beagle","Chihuahua","Poodle"), 
Longevity = c("20","11","12","15","16"))

#etc for types of birds, fish, snakes, and ferrets

#the following works
plot <- ggplot(data = cat, aes(x = Breed, y = Longevity, fill = Breed)) + 
  geom_bar(stat = "identity", position = position_dodge()) +
  xlab("Breed") +
  ylab("Longevity") +
  ggtitle("cat") +
  geom_text(aes(label = Longevity), vjust = -0.3, color = "black", size = 3.5) +
  theme(axis.line = element_line(color = "black"), axis.text = element_text(color = "black"), 
        legend.position = "none", plot.title = element_text(hjust = .5),
        panel.grid.minor = element_blank(), panel.grid.major = element_blank(),
        panel.border = element_rect(color = "black", fill = NA, size = 0.8),
        panel.background = element_rect(fill = NA), text = element_text(size=10))
print(plot)

gg_pets <- c("cat","dog","bird","fish","snake","ferret")

#the following does not work
for (i in 1:length(gg_pets)){
    plot <- ggplot(data = [i], aes(x = Breed, y = Longevity, fill = Breed)) + 
    geom_bar(stat = "identity", position = position_dodge()) +
    xlab("Breed") +
    ylab("Longevity") +
    ggtitle([i]) +
    geom_text(aes(label = Longevity), vjust = -0.3, color = "black", size = 3.5) +
    theme(axis.line = element_line(color = "black"), axis.text = element_text(color = "black"), 
          legend.position = "none", plot.title = element_text(hjust = .5),
          panel.grid.minor = element_blank(), panel.grid.major = element_blank(),
          panel.border = element_rect(color = "black", fill = NA, size = 0.8),
          panel.background = element_rect(fill = NA), text = element_text(size=10))
    print(plot)
}

【问题讨论】:

    标签: r for-loop ggplot2


    【解决方案1】:

    在您的示例中,gg_pets 只是一个字符串向量。您需要连接数据帧以便在 for 循环中对其进行迭代。你可以用一个列表来做。如下。您可以使用项目的名称作为标题。

    ...
    gg_pets <- list(cat=cat, dog=dog)
    
    #the following does not work
    for (i in 1:length(gg_pets)) {
      plot <- ggplot(data = gg_pets[[i]], aes(x = Breed, y = Longevity, fill = Breed)) + 
        geom_bar(stat = "identity", position = position_dodge()) +
        xlab("Breed") +
        ylab("Longevity") +
        ggtitle(names(gg_pets)[i]) +
        geom_text(aes(label = Longevity), vjust = -0.3, color = "black", size = 3.5) +
        theme(axis.line = element_line(color = "black"), axis.text = element_text(color = "black"), 
              legend.position = "none", plot.title = element_text(hjust = .5),
              panel.grid.minor = element_blank(), panel.grid.major = element_blank(),
              panel.border = element_rect(color = "black", fill = NA, size = 0.8),
              panel.background = element_rect(fill = NA), text = element_text(size=10))
      print(plot)
    }
    

    【讨论】:

    • 这是完美的,谢谢。如何在同一个窗口中绘制所有六个数字?在 for 循环之前和 for 循环内添加 par(mfrow = c(2,3)) 不起作用。
    • @Bex 也将 for 循环的图保存在列表中。 ` plots grid.arrange把它们放在一起。这是一个例子:gridExtra::grid.arrange(plots[[1]], plots[[2]], plots[[1]], plots[[2]], layout_matrix = rbind(c(1,2),c(3,4)))
    【解决方案2】:

    我认为你需要

    ggplot(data = get(i), ...)
    

    但将数据集放在命名列表(my_data_list &lt;- list(cat=cat, dog=dog, ...) 甚至 my_data_list &lt;- mget(gg_pets))中并使用 data = my_data_list[[i]] 可能会更惯用/更好的做法...

    【讨论】:

      【解决方案3】:

      其他答案中提到的list 方法的替代方法是首先将所有内容都放在相同的data.frame 中,因为显然所有表都具有相同的变量;然后再有一个变量表示观察对应的是哪种宠物。如下:

      pets_df <- bind_rows(cat %>% add_column(pet = 'cat'),
                           dog %>% add_column(pet = 'dog'))
      
      > pets_df
                      Breed Longevity pet
      1  American Shorthair        17 cat
      2             Ragdoll        19 cat
      3             Persian        15 cat
      4              Sphynx        17 cat
      5          Maine Coon        20 cat
      6            Havanese        20 dog
      7             Bulldog        11 dog
      8              Beagle        12 dog
      9           Chihuahua        15 dog
      10             Poodle        16 dog
      

      然后,在循环的每次迭代中,您只需过滤data.frame。例如:

      for (i in 1:length(gg_pets)) {
        plot <- ggplot(data = filter(pets_df, pet == gg_pets[i]), 
                       aes(x = Breed, y = Longevity, fill = Breed)) + 
          geom_bar(stat = "identity", position = position_dodge()) +
          xlab("Breed") +
          ylab("Longevity") +
          ggtitle(gg_pets[i]) +
          geom_text(aes(label = Longevity), vjust = -0.3, color = "black", size = 3.5) +
          theme(axis.line = element_line(color = "black"), axis.text = element_text(color = "black"), 
                legend.position = "none", plot.title = element_text(hjust = .5),
                panel.grid.minor = element_blank(), panel.grid.major = element_blank(),
                panel.border = element_rect(color = "black", fill = NA, size = 0.8),
                panel.background = element_rect(fill = NA), text = element_text(size=10))
        print(plot)
      }
      

      【讨论】:

        猜你喜欢
        • 2018-05-21
        • 2020-03-30
        • 2020-03-07
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多