问题描述
我正在尝试制作一个宽度可变的柱形图,其中有 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