我想使用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")
斋戒的方式可能是通过将线条手动绘制到导出的图像中来添加线条。但是,我更希望避免这种情况。
此Stackoverflow entry(尤其是Henrik的答案)提供了一种可能的解决方案。但是,我想知道是否还有另一种更通用的解决方案(即不需要手动定义线段/线的所有起点和终点)
答案 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())
将线条移到边缘而不是中心将需要一些手动工作。如果您确实只有两个堆栈,这没关系,但是很难轻松扩展。
在这种情况下,您希望将.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())
这不会在0处添加一行,因为这些值不在数据集中。可以将其作为段添加到
annotate(geom = "segment", y = 0, yend = 0, x = 1.45, xend = 1.55)