【发布时间】:2021-07-14 19:10:27
【问题描述】:
我有以下数据框:
set.seed(20210714)
dd <- data.frame(Method = rep(c("A", "B", "C"), each = 60), Pattern = as.factor(rep(c("X", "Y", "Z"), times = 30)), X1 = runif(180), Complexity = rep(c("High", "Low"), times = 90), nsim = rep(rep(1:10, times = 9), each = 2))
我想为每种方法以及三种模式和每种复杂性获得 X1 的箱线图。我使用以下情节:
ggplot(dd, aes(x = Pattern, y = X1, fill = Method)) +
facet_grid(~Complexity) +
geom_boxplot() +
theme(legend.position = 'bottom',
axis.text.x = element_text(angle = 45, hjust = 1)) +
guides(fill = guide_legend(nrow=1))
这给了我附图:
太棒了。但是,方法 A、B 和 C 的每个观察结果都在“X”内的同一数据集(带有指示符 nsim)上(“Y”内的情况相同,“Z”内的情况相同),我想将观察结果联系起来(X1 的值)在三个模式中的每一个中的三个方法之间(但不要链接三个模式,因为那将毫无意义)。
具体来说,我想要一个如下图(这里用手绘线来连接不同的模拟 IDS):
所以,我尝试了以下方法,但是,我不再将每个 x 的箱线图捆绑在一起(现在 x 轴也搞砸了)。
library(ggplot2)
ggplot(dd, aes(x = interaction(Method,Pattern), y = X1, fill = Method)) +
geom_boxplot(aes(fill = Method), position = "identity") +
geom_line(aes(x = interaction(Method,Pattern), y = X1,
group=interaction(Pattern,nsim)),
size = 0.15, alpha = 0.5, colour = I("#525252")) +
facet_grid(~Complexity) +
theme_light() +
theme(legend.position = 'bottom') +
guides(fill = guide_legend(nrow=1)) +
geom_line(aes(x = interaction(Method,Pattern),
group=interaction(Pattern,nsim)),
size = 0.35, alpha = 0.5, colour = I("#525252")) +
geom_point(aes(x = interaction(Method,Pattern),
group=interaction(Pattern,nsim)),
size = 0.35, alpha = 0.5, colour = I("#525252")) +
scale_x_discrete(labels = c("","X", "", "", "Y", "", "", "Z","")) + xlab("Pattern")
这给出了以下内容:
但是每个 Pattern 设置的箱线图被分开(我希望它们捆绑在一起)并且 x 轴也被弄乱了(我有一些不雅的修复)。所以,我需要解决的最重要的事情仍然是每个 Pattern 内部箱线图之间的空间(我希望它更小),而不是不同模式的箱线图之间的空间。
我该如何解决这个问题?非常感谢您的建议。
【问题讨论】:
-
您能否提供一个草图或更清晰的说明,说明您希望该图的外观如何?
-
对于最左边的红色箱线图,有 15000 个观察值,这意味着每个
Method/nsim排列有 50 个不同的值。如果您想要 1 条红线将各个组之间的nsim联系在一起,那么您希望将特定组中的 50 个nsim值中的哪一个与其他组联系起来? -
糟糕!抱歉,我的测试代码不正确,现在每个 Method x Pattern 组合只有一个模拟 ID。谢谢,@r2evans!
-
这有点挑战性,因为你的 x 轴是离散的,而不是数字的,所以你必须假装很多。
-
问题似乎是将 geom_line() 分层(或可能在)一组已经用作填充和 x 轴的值。 aggr% group_by(Pattern,Complexity,Method) %>% summarise(MeanX=mean(X1,na.rm=T),Method=first(Method)) ; aggr$Method2