R中具有cumsum函数的可变宽度柱形图

Variable width column chart with cumsum function in R

我正在尝试制作一个宽度可变的柱形图,其中有 4 个不重叠的柱,每个柱代表一个步骤。

每列的宽度:width = c(25,50,75,100) 高度 = c(10,20,40,30)

这是我发现的代码,只要宽度值为正,它就可以很好地工作:

每列的终点:df$w <- cumsum(df$width) 导致 (25,75,150, 250)

每列的起点:df$wm <- df$w - df$width 导致 (0,25,75,150)

如果第一列的宽度为负数 (-25,50,75,100),则上述列终点的 cumsum 代码 (w) 结果为 (-25,25,100,200 ) 和起点给出 (0, -25,25,100)。这意味着我的列重叠。而且我不希望有任何重叠,所以我想修改上面的代码以产生以下结果:端点 w=(-25,50, 125, 225) 和起点 (0,0,50,125).

有人可以帮我吗?

这应该能满足您的需求 -

widths_to_starts_ends <- function(widths){
  
  widths <- widths[widths != 0]
  pos_widths <- widths[widths > 0]
  neg_widths <- widths[widths < 0]
  
  pos_ends <- cumsum(pos_widths)
  pos_starts <- cumsum(pos_widths) - pos_widths
  
  neg_widths <- abs(neg_widths)
  neg_starts <- cumsum(neg_widths)
  neg_ends <- cumsum(neg_widths) - neg_widths
  
  neg_starts <- (-1)*neg_starts
  neg_ends <- (-1)*neg_ends
  
  return( list(s = c(neg_ends, pos_starts), e = c(neg_starts, pos_ends)) )
  
}

widths_to_starts_ends(c(25,50,75,100))
$s
[1]   0  25  75 150

$e
[1]  25  75 150 250

结果为“负宽度”-

widths_to_starts_ends(c(-25,50,75,100))
$s
[1]   0   0  50 125

$e
[1] -25  50 125 225