使用线条将多个分组的ggplot箱线图连接起来

3
我想连接多个因素的ggplot2箱线图和geom_lines。到目前为止,我已经能够连接所有箱线图与线条,请参见附图。但是,我希望通过它们对应的因素仅连接相应的箱线图。
例如,对于我的变量FL,我只想连接这两个箱线图,而不连接其余变量。同样地,对于变量RW,连接这两个性别箱线图而不连接其他变量。
library("MASS")  
data(crabs)  
melt_crabs <- melt(crabs,id.var=c("sp","sex","index"))   
ggplot(melt_crabs, aes(x = variable, y = value)) +   geom_line(aes(group = index), size = 0.05, alpha = 0.7) +   geom_boxplot(aes(fill = sp), alpha = 0.5) + facet_grid(sex~.)

有人知道如何实现这个吗?我希望我表达得最清楚。

非常感谢和最好的祝愿,


你的代码没有生成你展示的图形。我认为你只是交换了 sexsp - Stibu
@Stibu 谢谢您的回复和编辑代码。我是新手,我以为它已经显示了,对此我感到抱歉。使用性别和 sp 不重要。这里的例子是在同一因素下有两个箱形图并将它们连接起来。非常感谢。 - Stat_Isra
2个回答

6

我不知道如何在你生成的图中精确地连接点,但是我可以向您展示如何做类似的事情。

困难在于所有属于一对箱线图的点共享相同的x坐标(即variable的相同值)。因此,我将interaction(sex,variable)用作x坐标,使每个箱线图都有自己的x值。然而,这意味着配对的箱线图不太容易看到。另一方面,连接线则是以相反的方式工作。

为了绘制这些线条,它们被interaction(index,variable)分组,这意味着当它们共享indexvariable的相同值时,数据点会连接起来。

足够说了,下面是代码:

ggplot(melt_crabs, aes(x = interaction(sex, variable), y = value)) +
    geom_boxplot(aes(fill = sex), alpha = 0.5) +
    geom_line(aes(group = interaction(index, variable)),
              alpha = 0.5, colour = "darkgrey") +
    facet_grid(sp~.) +
    scale_x_discrete(labels = rep(levels(melt_crabs$variable), each = 2))

enter image description here


5

@Stibu的回答绝对是获得所需输出最快捷、最干净的方法。在他的回答基础上,由于对于给定变量,图形不再相邻,您可能希望将每个图形放在它们各自的单独图形中。这可以通过对@Stibu代码中的facet_grid调用进行微小调整来轻松实现:

ggplot(melt_crabs, aes(x = interaction(sex, variable), y = value)) +
  geom_boxplot(aes(fill = sex), alpha = 0.5) +
  geom_line(aes(group = interaction(index, variable)),
            alpha = 0.5, colour = "darkgrey") +
  facet_grid(sp~variable,scales="free_x") +
  scale_x_discrete(labels = "")

这里输入图片描述

此外,我进行了一些调查,如果您想将顶部条移到底部,这并不难。适应以下代码:如何在分面时显示绘图下方的条形标签?

我们得到:

p<-ggplot(melt_crabs, aes(x = interaction(sex, variable), y = value)) +
  geom_boxplot(aes(fill = sex), alpha = 0.5) +
  geom_line(aes(group = interaction(index, variable)),
            alpha = 0.5, colour = "darkgrey") +
  facet_grid(sp~variable,scales="free_x") +
  scale_x_discrete(labels = "")

# Convert the plot to a grob
gt <- ggplotGrob(p)

# Get the positions of the panels in the layout: t = top, l = left, ...
panels <-c(subset(gt$layout, name == "panel", select = t:r))

# Get the strip grob & x-axis label grob
stripGrob = gtable_filter(gt, "strip-top")

#Replace x-axis ticks with strip
gt = gtable_add_grob(gt, stripGrob, t = max(panels$b)+1, l = min(panels$l), r = max(panels$r))

# remove the old strip
gt = gt[-(min(panels$t)-1), ]

grid.newpage()
grid.draw(gt)

enter image description here


非常感谢您的帮助。使用interaction()函数正是我所需要的。非常感谢并致以最美好的祝福! - Stat_Isra
1
使用 facets 的绝妙主意!在这种情况下,实际上不再需要 x = interaction(sex, variable),而是可以直接使用 x = sex。我无法精确复制您的图表;您使用的是哪个版本的 ggplot2?在最新版本中,可以通过在 facet_grid() 中使用 switch = "x" 将 facet 标签移动到底部。这看起来不太像您的变体那样漂亮,因为它会保留底部的刻度。使用 scale_x_discrete(labels = NULL, breaks = NULL) 可以让它更好看,但您的解决方案仍然更美观。 - Stibu
在这个例子中,我使用的是1.0.1版本...有点过时了,我知道。但我不知道facet_grid()中的switch = "x"功能,这绝对是一种更快的获得类似输出的方法。谢谢!另外,我刚刚安装了最新版本的ggplot2和最新的R版本,相同的代码似乎对我有效,我的想法只是可能我们使用的网格版本不同?我正在使用0.2.0版本。 - Mike H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接