【问题标题】:How to create multiple ggboxplots on the same graph using the loop function?如何使用循环函数在同一个图上创建多个 ggboxplots?
【发布时间】:2021-02-19 03:01:26
【问题描述】:

TL;DR:尝试使用循环函数在一张图中使用ggboxplot 创建多个箱线图(附图片)。目前为每个箱线图手动创建代码,然后使用ggarrange() 或par() 函数将它们绘制在一起。它有效,但正在寻找一种重复性较低的方式。

我想知道是否可以使用循环函数创建多个ggboxplots。我在 StackOverflow 上看到了多个回复/解决方案,但没有一个能完全准确地捕捉到我正在寻找的解决方案(或者通常不需要使用循环函数)。

我的数据如下所示:

# A tibble: 62 x 4
   offer payoff  partner_transfer  round_type
   <dbl>  <dbl>       <dbl>         <chr>     
 1    40    126        66           actual    
 2   100    273       273           actual    
 3     0    100        0            actual    
 4   100      6        6            actual    
 5    25     99       24            actual    
 6    80     29        9           practice    
 7   100     45       45           practice    
 8     0    100        0           practice    
 9    25     99       24           practice    
10   100    183       183          practice    
# ... with 52 more rows

我想要得到的输出是这样的:

我可以通过运行多个代码,然后使用ggarrange() 函数将它们组合起来(如下):

box_offer <- ggboxplot(data = tg_proposer_split, x = "round_type", y = "offer",
                   fill = "round_type",
                   palette = "ucscgb",
                   ylab = "Offer (by A)", xlab = "Round Type",
                   add = "jitter",
                   shape = "round_type")

box_partner_transfer <- ggboxplot(data = tg_proposer_split, x = "round_type", y = "partner_transfer",
                   fill = "round_type",
                   palette = "ucscgb",
                   ylab = "Amount Transferred by Partner (Bot)", xlab = "Round Type",
                   add = "jitter",
                   shape = "round_type")

box_payoff <- ggboxplot(data = tg_proposer_split, x = "round_type", y = "payoff",
                       fill = "round_type",
                       palette = "ucscgb",
                       ylab = "Payoff (for A)", xlab = "Round Type",
                       add = "jitter",
                       shape = "round_type")

ggarrange(box_offer, box_partner_transfer, box_payoff, 
          labels = c("A", "B", "C"),
          ncol = 2, nrow = 2)

我要解决的另一种方法是使用par() 函数(但要绘制手段)。图片在这里:

我使用的代码是:

par(mfrow = c(2,2))

plot_offer <- plotmeans( offer ~ round_type, data = tg_proposer_split,
          xlab = "Round Type", ylab = "Offer (by A)",
          main="Mean Plot with 95% CI") 

plot_partner_transfer <- plotmeans( partner_transfer ~ round_type, data = tg_proposer_split,
          xlab = "Round Type", ylab = "Amount Transferred by Partner (Bot)",
          main="Mean Plot with 95% CI") 

plot_payoff <- plotmeans( payoff ~ round_type, data = tg_proposer_split,
          xlab = "Round Type", ylab = "Payoff (for A)",
          main="Mean Plot with 95% CI") 

虽然使用 ggarrange() 或 par() 可以满足我的需求,但这有点太麻烦了,因为有时我有超过 10 个列/变量要为其创建箱线图。因此,如果有一种更短的方法来获得我想要的输出而不会在我的代码中重复,我会尝试在这里找到一些运气。我不确定问题是否在于我组织数据集的方式使这个过程变得困难,但无论哪种方式,我都愿意接受不同的解决方案。

【问题讨论】:

    标签: r loops boxplot ggpubr


    【解决方案1】:

    您可以使用Map 创建绘图列表并使用ggarrange 绘制它。分别传递列名和 y 标签。

    library(ggpubr)
    
    cols <- setdiff(names(tg_proposer_split), 'round_type')
    y_labels <- c("Offer (by A)", "Amount Transferred by Partner (Bot)", "Payoff (for A)")
    
    Map(function(x, y) {
      ggboxplot(data = tg_proposer_split, x = "round_type", y = x,
                fill = "round_type",
                palette = "ucscgb",
                ylab = y, xlab = "Round Type",
                add = "jitter",
                shape = "round_type")
    }, cols, y_labels) -> list_plots
    
    ggarrange(plotlist = list_plots, common.legend = TRUE)
    

    数据

    tg_proposer_split <- structure(list(offer = c(40L, 100L,0L,100L, 25L, 80L,100L, 
    0L, 25L, 100L), payoff = c(126L, 273L, 100L, 6L, 99L, 29L, 45L, 
    100L, 99L, 183L), partner_transfer = c(66L, 273L, 0L, 6L, 24L, 
    9L, 45L, 0L, 24L, 183L), round_type = c("actual", "actual", "actual", 
    "actual", "actual", "practice", "practice", "practice", "practice", 
    "practice")), class = "data.frame", row.names = c(NA, -10L))
    

    【讨论】:

    • 非常感谢,Ronak - 这非常有效。我可以重命名每个箱线图的 y 标签吗?如果是这样,我应该怎么做?
    • 您可以将它们单独传递为y_labels。请参阅我的更新答案。
    • 我的另一个问题是: 1. 在尝试绘制“绘图均值”时,我尝试复制此代码(在给出的第二个图像/第二个示例中),但它似乎不起作用。这是我复制的代码:par(mfrow = c(2,2)) cols2 &lt;- setdiff(names(tg_recipient_split[26:28]), "round_type") lapply(cols, function(x) { plotmeans(x ~ round_type, data = tg_recipient_split, xlab = "Round Type", ylab = x, main = "Mean Plot with 95% CI") }) -&gt; list_plots2 再次感谢!
    • 我建议将其作为新问题提出,并让这篇文章只关注一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2013-02-23
    • 2021-05-22
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多