使用线和多个因子连接ggplot箱图

时间:2016-03-26 20:46:20

标签: r plot ggplot2 data-visualization boxplot

我正在尝试将ggplot2箱图与geom_lines连接以用于多种因素。到目前为止,我已经完成了将所有的boxplot连接到线条,请参阅附图。但我希望通过相应的因素连接唯一的箱图。

enter image description here

例如对于我的变量FL,我想只连接那两个boxplot,而不将它们与剩余的变量连接起来。类似地,对于变量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~.)

有谁知道如何实现这一目标?我希望我能以最明确的方式解释自己。

非常感谢和祝福,

2 个答案:

答案 0 :(得分:4)

我不知道如何在您生成的情节中连接点。但我可以告诉你如何做类似的事情。

难点在于,属于箱图的的所有点共享相同的x坐标(即variable的相同值)。因此我使用interaction(sex, variable)作为x坐标,这样每个boxplot都有自己的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

答案 1 :(得分:2)

@ 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 = "")

enter image description here

如果你想将顶部条带移到底部,我也做了一些挖掘,这并不困难。调整以下代码:How to display strip labels below the plot when faceting?

我们得到:

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