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

问题描述

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

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

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

每列的结束点:df$w

每列的起点:df$wm

如果第一列的宽度 (-25,100) 为负数,则上述列 (w) 终点的 cumsum 代码将导致 (-25,25,100,200 ) 和起始点给出 (0,-25,100)。这意味着我的列重叠。而且我不想有任何重叠,所以我想修改上面的代码以得到以下结果:端点 w=(-25,125,225) 和起点 (0,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,100))
$s
[1]   0   0  50 125

$e
[1] -25  50 125 225