barplot与连接系列

时间:2014-03-21 13:57:12

标签: r time-series bar-chart

我有一些数据是一组随时间变化的百分比。我想将这些数据显示为带有连接系列的线条的堆积条形图:

    m <-barplot(b)
    lines(c(m[1]+0.5,m[2]-0.5), c(0,0))
    lines(c(m[1]+0.5,m[2]-0.5), c( b[1,1], b[1,2]))
    lines(c(m[1]+0.5,m[2]-0.5), c( b[1,1]+b[2,1], b[1,2]+b[2,2]))
    lines(c(m[1]+0.5,m[2]-0.5), c( b[1,1]+b[2,1]+b[3,1], b[1,2]+b[2,2]+b[3,2]))
    lines(c(m[1]+0.5,m[2]-0.5), c( b[1,1]+b[2,1]+b[3,1]+b[4,1], b[1,2]+b[2,2]+b[3,2]+b[4,2]))

这样的情节让我得到了这个情节,但当我想要每个时间点更多的列或更多部分时,这当然会严重缩放。我已经尝试在for循环中添加行,但我无法完全正确。有人知道如何以更灵活的方式做到这一点,还是有一个实现这个情节的包?

2 个答案:

答案 0 :(得分:1)

免责声明:这是从问题中提取的。

以下是如何执行此操作的示例:

dat <- matrix(c(3,4,5,9,2,1,5,6,5,5,6,2), nrow=3)

color=c("darkgreen", "darkgrey", "gold", "darkblue")


barplot_series <- function(dat, color) {
    b <- barplot(dat, col=color, las=2)

    #columns i are the samples
    for (i in 1:dim(dat)[2] - 1 ) {
        if (i < 1) {next}
        print (c("column", i))

    #rows j: these are the individual clones
        for (j in 1: dim(dat)[1] ) { # or dim(dat)[1]-1
            if (j < 1) {next}
            print (c("row", j))
            if (j < 2) {
                lines(c(b[i]+0.5, b[i+1]-0.5), c(dat[j,i], dat[j,i+1]))
            }
            if (j > 1) {
                lines(c(b[i]+0.5, b[i+1]-0.5), c(colSums(dat[1:j,])[i], colSums(dat[1:j,])[i+1]))
            }
        }
    }
}

barplot_series(dat, color)

可能有更好的方法来实现相同的目标,但是此功能会生成我正在寻找的连接系列的堆积条形图,并使用包含数据的矩阵进行缩放。

答案 1 :(得分:0)

如上所述:这是我为初步问题制定的答案。

dat <- matrix(c(3,4,5,9,2,1,5,6,5,5,6,2), nrow=3)

color=c("darkgreen", "darkgrey", "gold", "darkblue")


barplot_series <- function(dat, color) {
    b <- barplot(dat, col=color, las=2)

    #columns i are the samples
    for (i in 1:dim(dat)[2] - 1 ) {
        if (i < 1) {next}
        print (c("column", i))

    #rows j: these are the individual clones
        for (j in 1: dim(dat)[1] ) { # or dim(dat)[1]-1
            if (j < 1) {next}
            print (c("row", j))
            if (j < 2) {
                lines(c(b[i]+0.5, b[i+1]-0.5), c(dat[j,i], dat[j,i+1]))
            }
            if (j > 1) {
                lines(c(b[i]+0.5, b[i+1]-0.5), c(colSums(dat[1:j,])[i], colSums(dat[1:j,])[i+1]))
            }
        } 
    }
}

barplot_series(dat, color)