MWE中的x.wanted
使用在上一行计算的x.wanted
,然后添加实际行中的值。如何在data.table中完成?我以为shift
是这样,但是给出了错误的结果。
x.wanted
是一种在图形中分隔条宽不同的条的方法。
library(data.table)
library(ggplot2)
dt <- data.table(x.group=c(rep(1L, 4L), rep(2L, 5L)),
x.width=c(2L, 4L, 2L, 6L, 4L, 2L, 4L, 6L, 2L),
x.sep=c(0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L),
x.wanted=c(1, 5, 9, 14, 2, 6, 10, 16, 21))
dt[, x.try.1:=x.width/2]
dt[, x.try.1:=shift(x=x.try.1, fill=0, type="lag") + x.sep + x.width/2, by=x.group]
p <- ggplot(dt, aes(x=x.wanted, y=5))
p <- p + geom_bar(aes(width=x.width), stat="identity", position="stack")
p <- p + facet_grid(x.group~., scales="free_x")
p
已添加图以可视化所需结果。 x.try.1是我失败的尝试。
答案 0 :(得分:2)
如果我理解正确,则OP希望找到条形图的中点。这可以通过使用cumsum()
函数(加上shift()
)来实现:
dt[, x.mid := cumsum(shift(x.width, fill = 0) + x.sep) + x.width/2, by = x.group][]
x.group x.width x.sep x.wanted x.try.1 x.mid 1: 1 2 0 1 1 1 2: 1 4 1 5 4 5 3: 1 2 1 9 4 9 4: 1 6 1 14 5 14 5: 2 4 0 2 2 2 6: 2 2 1 6 4 6 7: 2 4 1 10 4 10 8: 2 6 1 16 6 16 9: 2 2 1 21 5 21
x.mid
的计算值与OP的x.wanted
一致。
另一种方法是绘制矩形而不是条形图。恕我直言,这将使用x轴上的左右角点,从而使计算更加简单:
dt[, x.min := cumsum(shift(x.width, fill = 0) + x.sep), by = x.group]
ggplot(dt, aes(xmin = x.min, xmax = x.min + x.width, ymin = 0, ymax = 5)) +
geom_rect() +
facet_grid(x.group ~ .)
这将创建与OP的问题相同的图表。