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

Bus*_*oot 2 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")
Run Code Online (Sandbox Code Playgroud)

图。1 图2

禁食方式可能会通过手动将线条绘制到导出的图像中来添加线条。但是,我更喜欢避免这种情况。

这个Stackoverflow 条目(特别是Henrik的回答)给出了一个潜在的解决方案。但是,我想知道是否有另一种更通用的解决方案(即不需要手动定义线段/线的所有起点和终点)

aos*_*ith 5

您可以使用“因子作为数字”技巧在条形中心之间绘制线条(例如,此处所示)。

在您的情况下,这需要与在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())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 使线条到达边缘而不是中心需要一些手动工作。如果您真的只有两个这样的堆栈也没关系,但是很难轻松扩展。

在这种情况下,您希望将 .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())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这不会在 0 处添加一行,因为这些值不在数据集中。这可以添加为沿线的一个段

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