有没有一种有效的方法使用ggplot2在堆叠条形图中的不同元素之间绘制线?

时间:2018-07-06 15:02:50

标签: r ggplot2

我想使用ggplot2在堆叠条形图中绘制不同元素之间的线。 我已经使用ggplot2(第一个图)绘制了一个堆积的条形图,但想得到第二个图所示的东西。

dta <- tribble(
  ~colA, ~colB, ~colC,
  "A",   "a",   1,
  "A",   "b",   3,
  "B",   "a",   4,
  "B",   "b",   2); dta

ggplot(dta, aes(x = colA, y = colC, fill = colB)) + 
  geom_bar(stat = "identity")

Fig. 1 Fig. 2

斋戒的方式可能是通过将线条手动绘制到导出的图像中来添加线条。但是,我更希望避免这种情况。

Stackoverflow entry(尤其是Henrik的答案)提供了一种可能的解决方案。但是,我想知道是否还有另一种更通用的解决方案(即不需要手动定义线段/线的所有起点和终点)

1 个答案:

答案 0 :(得分:4)

您可以使用“数字因子”技巧在条形中心之间绘制线(例如here)。

在您的情况下,这需要与geom_line()中的堆叠结合使用。

ggplot(dta, aes(x = colA, y = colC, fill = colB)) + 
    geom_bar(stat = "identity") +
    geom_line( aes(x = as.numeric(factor(colA))), 
               position = position_stack())

enter image description here 将线条移到边缘而不是中心将需要一些手动工作。如果您确实只有两个堆栈,这没关系,但是很难轻松扩展。

在这种情况下,您希望将.45添加到第一个出现在x轴上的组,然后从第二个减去0.45。这似乎很神奇,但是默认的width是数据分辨率的90%,因此我使用了0.9的一半。

dta = transform(dta, colA_num = ifelse(colA == "A",
                                    as.numeric(factor(colA)) + .45,
                                    as.numeric(factor(colA)) - .45) )


ggplot(dta, aes(x = colA, y = colC, fill = colB)) + 
    geom_bar(stat = "identity") +
    geom_line( aes(x = colA_num), 
               position = position_stack())

enter image description here

这不会在0处添加一行,因为这些值不在数据集中。可以将其作为段添加到

annotate(geom = "segment", y = 0, yend = 0, x = 1.45, xend = 1.55)