r - 如何使用循环函数在同一个图上创建多个 ggboxplots?
问题描述
TL;DR:尝试ggboxplot
使用循环功能在一个图表中创建多个箱线图(附图片)。目前为每个箱线图手动创建代码,然后使用其中一个ggarrange()
或par()
函数将它们绘制在一起。它有效,但正在寻找一种重复性较低的方式。
我想知道是否可以ggboxplot
使用循环函数创建多个 s 。我在 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 个列/变量要为其创建箱线图。因此,如果有一种更短的方法来获得我想要的输出而不会在我的代码中重复,我会尝试在这里找到一些运气。我不确定问题是否在于我组织数据集的方式使这个过程变得困难,但无论哪种方式,我都愿意接受不同的解决方案。
解决方案
您可以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))
推荐阅读
- git - 如何在合并到 master 时运行集成
- python - 如何在数据框中批量滞后列
- ruby-on-rails - 活动存储:TypeError:没有将 Symbol 显式转换为 String
- html - 如何仅在悬停时显示滚动条?(支持手机)
- powershell - 为什么 ConvertTo-Json 会丢弃值
- haskell - simpleHTTP 函数在哪个库中?
- jquery - click 事件中的 jQuery on() 方法无论点击如何都会执行
- javascript - 使用 Firebase 云功能更新另一个位置 onUpdate
- java - 在 JavaFX 中将 MouseEvent 应用于 GridPane 中的节点
- apache-kafka-streams - kafka steams 应用程序是否可以从单个输入写入多个输出?