如何使用循环函数在同一张图上创建多个 ggboxplots?
How to create multiple ggboxplots on the same graph using the loop function?
TL;DR:尝试使用循环函数在一张图中使用 ggboxplot
创建多个箱线图(附图)。当前为每个箱线图手动创建代码,然后使用 ggarrange()
或 par()
函数将它们绘制在一起。它有效,但正在寻找一种重复性较低的方法。
我想知道是否可以使用循环函数创建多个 ggboxplot
。我在 Whosebug 上看到了多个 replies/solutions,但其中 none 非常准确地捕获了我正在寻找的解决方案(或者通常不需要使用循环函数)。
我的数据看起来像这样:
# 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 个 columns/variables 我想为其创建箱线图.因此,如果有更短的方法来获得我想要的输出而不在我的代码中重复,我想在这里找到一些运气。我不确定问题是否出在我组织数据集的方式上,这让这个过程变得困难,但无论哪种方式,我都愿意接受不同的解决方案。
您可以使用 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))
TL;DR:尝试使用循环函数在一张图中使用 ggboxplot
创建多个箱线图(附图)。当前为每个箱线图手动创建代码,然后使用 ggarrange()
或 par()
函数将它们绘制在一起。它有效,但正在寻找一种重复性较低的方法。
我想知道是否可以使用循环函数创建多个 ggboxplot
。我在 Whosebug 上看到了多个 replies/solutions,但其中 none 非常准确地捕获了我正在寻找的解决方案(或者通常不需要使用循环函数)。
我的数据看起来像这样:
# 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 个 columns/variables 我想为其创建箱线图.因此,如果有更短的方法来获得我想要的输出而不在我的代码中重复,我想在这里找到一些运气。我不确定问题是否出在我组织数据集的方式上,这让这个过程变得困难,但无论哪种方式,我都愿意接受不同的解决方案。
您可以使用 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))