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