R 使用直线和多因子连接ggplot盒形图

R 使用直线和多因子连接ggplot盒形图,r,plot,ggplot2,data-visualization,boxplot,R,Plot,Ggplot2,Data Visualization,Boxplot,我正在尝试将ggplot2箱线图与多因素的geom_线连接起来。到目前为止,我已经能够将所有箱线图与线连接起来,请参见附图。但我希望通过相应的因子连接唯一的箱线图 例如,对于我的变量FL,我只想连接这两个箱线图,而不想将它们与其余变量连接。同样,对于变量RW,连接这两个性别的箱线图,而不连接其余的性别箱线图 library("MASS") data(crabs) melt_crabs <- melt(crabs,id.var=c("sp","sex","index")) g

我正在尝试将ggplot2箱线图与多因素的geom_线连接起来。到目前为止,我已经能够将所有箱线图与线连接起来,请参见附图。但我希望通过相应的因子连接唯一的箱线图

例如,对于我的变量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~.)
library(“MASS”)
数据(crabs)

融化螃蟹我不知道如何将你绘制的图中的点连接起来。但我可以教你怎么做类似的事情

困难在于属于一对箱线图的所有点共享相同的x坐标(即,变量的值相同)。因此,我使用了
交互(性别、变量)
作为x坐标,这样每个箱线图都有自己的x值。然而,这意味着成对的箱线图不太可见。另一方面,连接线在另一个方向工作

为了绘制线,它们按
交互(索引,变量)
分组,这意味着当它们共享
索引
变量
的相同值时,数据点是连接的

说够了,下面是代码:

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))

@Stibu的答案绝对是获得所需输出的最快捷、最干净的方法。根据他的答案,因为对于给定的变量,曲线图不再相邻,所以您可能希望将每个曲线图放在各自独立的曲线图中。只需对@Stibu代码中的
facet_网格
调用稍作调整即可轻松实现:

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)

p您的代码不会生成您显示的图形。我想你刚刚交换了
sex
sp
@Stibu谢谢你回复和编辑代码。我是新来的,我想这是我道歉的表现。性和sp的使用并不重要。这里的示例是在同一因子中有两个箱线图,并将它们连接起来。非常感谢。谢谢你的帮助。使用interaction()函数正是我所需要的。非常感谢并致以最良好的祝愿!使用方面的好主意!在这种情况下,实际上不再需要
x=interaction(sex,variable)
,您可以使用
x=sex
。我不能准确地再现你的情节;您使用的是哪个版本的ggplot2?在最新版本中,您可以使用
facet\u grid()
中的
switch=“x”
将facet标签移动到底部。这看起来不像您的变体那么好,因为它在底部留下了记号。使用
scale\u x\u discrete(labels=NULL,breaks=NULL)
它变得更好了,但您的解决方案看起来仍然更漂亮。我在本例中使用的是1.0.1版…我知道有点过时。但是我不知道
facet\u grid()
中的
switch=“x”
功能,这绝对是获得类似输出的更快方法。谢谢另外,我刚刚安装了最新版本的ggplot2和最新版本的R,同样的代码似乎也适用于我,我唯一的想法是我们可能在使用哪个网格版本上有所不同?我使用的是0.2.0版。