【问题标题】:ggplot2: draw lines connecting observations in each group in faceted boxplotggplot2:在多面箱线图中绘制连接每组观察值的线
【发布时间】: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

标签: r ggplot2


【解决方案1】:

这是你要找的吗?

ggplot(dd, aes(x = Pattern, y = X1, fill = Method)) +
  geom_line(aes(group=interaction(Method,nsim)), 
            position = position_dodge(width = 0.8),
            size = 0.1, alpha = 0.5, colour = I("#525252"))  + 
  facet_grid(~Complexity) + 
  geom_boxplot() +
  theme(legend.position = 'bottom',
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  guides(fill = guide_legend(nrow=1)) +
  theme_light()

【讨论】:

  • 差不多,但不完全。跨模式的 nsim 不具有可比性,因此线必须在 x、y、z 中的每一个处停止。我有一个替代方案,但还是有点混乱。
  • @user3236841 我认为您可以通过构建一个 真正最小的 示例来让试图帮助您的人更容易 - 当您可以跟踪时更容易显示和解释逻辑几个点/线,然后人们更容易验证他们的代码。干杯。
  • @Henrik,很好。在每种情况下使用 10 个数据点编辑问题,希望能够更轻松地跟踪线条。
【解决方案2】:

我不确定是否有更好的方法来做到这一点,但我做了以下:

set.seed(20210714)
dd <- data.frame(Method = rep(c("A", "B", "C"), each = 60), Pattern = 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))

library(ggplot2)

# create dummy dataframe.
dummy.df <- dd
dummy.df[nrow(dd) + 1:2,"Pattern"] <- unique(dd$Pattern)[-3]
dummy.df[nrow(dd) + 1:2,"Method"] <- "ZZZ"
dummy.df[nrow(dd) + 1:2,"Complexity"] <- c("High","Low")

dummy.df$dummy <- interaction(dummy.df$Method,dummy.df$Pattern)             


ggplot(dummy.df, aes(x = dummy, y = X1, fill = Method)) +
      geom_boxplot(aes(fill = Method)) + 
    geom_line(aes(x = dummy, 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 = dummy, 
                group=interaction(Pattern,nsim)), 
            size = 0.35, alpha = 0.5, colour = I("#525252"))  + 
    geom_point(aes(x = dummy, 
                group=interaction(Pattern,nsim)), 
               size = 0.35, alpha = 0.5, colour = I("#525252"))  +
   scale_x_discrete(labels = c("","X", "", "", "", "Y", "", "", "", "Z","","")) +
    xlab("Pattern") +
    scale_fill_brewer(breaks=c("A", "B", "C"), type="qual", palette="Dark2")

产生以下结果:

我希望箱线图彼此更接近,如果有人有任何想法,我希望得到一些关于如何做到这一点的建议。也许下一步将把它写成一个通用函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2021-11-20
    • 2020-12-08
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多