【问题标题】:Stacked barplot using R base: how to add values inside each stacked bar使用 R 基础的堆叠条形图:如何在每个堆叠条内添加值
【发布时间】:2016-12-01 20:26:52
【问题描述】:

我在一本统计书中找到了一个情节,我想用基本包复制它。

剧情如下:

到目前为止,我已经有了情节,但是在向条形的每个部分添加居中标签时遇到了问题。

我的代码如下所示:

data   <- sample( 5, 10 , replace = TRUE )

colors <- c('yellow','violet','green','pink','red')

relative.frequencies <- as.matrix( prop.table( table( data ) ) )

bc <- barplot( relative.frequencies, horiz = TRUE, axes = FALSE, col = colors )

【问题讨论】:

    标签: r plot bar-chart


    【解决方案1】:

    对于您给定的示例,我们可以这样做(所有读者可以跳过这部分并跳转到下一部分):

    set.seed(0)  ## `set.seed` for reproducibility
    dat <- sample( 5, 10 , replace = TRUE )
    colors <- c('yellow','violet','green','pink')
    h <- as.matrix( prop.table( table( dat ) ) )
    ## compute x-location of the centre of each bar
    H <- apply(h, 2L, cumsum) - h / 2
    ## add text to barplot
    bc <- barplot(h, horiz = TRUE, axes = FALSE, col = colors )
    text(H, bc, labels = paste0(100 * h, "%"))
    


    所有读者

    我现在将构建一个全面的示例供您消化这个想法。

    第 1 步:为实验生成一个百分比玩具矩阵

    ## a function to generate `n * p` matrix `h`, with `h > 0` and `colSums(h) = 1`
    sim <- function (n, p) {
      set.seed(0)
      ## a positive random matrix of 4 rows and 3 columns
      h <- matrix(runif(n * p), nrow = n)
      ## rescale columns of `h` so that `colSums(h)` is 1
      h <- h / rep(colSums(h), each = n)
      ## For neatness we round `h` up to 2 decimals
      h <- round(h, 2L)
      ## but then `colSums(h)` is not 1 again
      ## no worry, we simply reset the last row:
      h[n, ] <- 1 - colSums(h[-n, ])
      ## now return this good toy matrix
      h
      }
    
    h <- sim(4, 3)
    #     [,1] [,2] [,3]
    #[1,] 0.43 0.31 0.42
    #[2,] 0.13 0.07 0.40
    #[3,] 0.18 0.30 0.04
    #[4,] 0.26 0.32 0.14
    

    第 2 步:了解堆叠条形图并获取每个堆叠条的“中间高度”

    对于堆积条形图,条形的高度是h每一列的累加和:

    H <- apply(h, 2L, cumsum)
    #     [,1] [,2] [,3]
    #[1,] 0.43 0.31 0.42
    #[2,] 0.56 0.38 0.82
    #[3,] 0.74 0.68 0.86
    #[4,] 1.00 1.00 1.00
    

    我们现在移回h / 2 以获取每个堆叠条的中间/中心:

    H <- H - h / 2
    #      [,1]  [,2] [,3]
    #[1,] 0.215 0.155 0.21
    #[2,] 0.495 0.345 0.62
    #[3,] 0.650 0.530 0.84
    #[4,] 0.870 0.840 0.93
    

    第 3 步:制作带有实心数字的条形图

    对于垂直条形图,上面的H 给出了每个堆叠条形中心的y 坐标。 x 坐标由 barplot 返回(不可见)。请注意,在使用text 时,我们需要复制x 的每个元素nrow(H) 次:

    x <- barplot(h, col = 1 + 1:nrow(h), yaxt = "n")
    text(rep(x, each = nrow(H)), H, labels = paste0(100 * h, "%"))
    

    对于水平条形图,上面的H 给出了每个堆叠条形中心的x 坐标。 y 坐标由barplot 返回(不可见)。请注意,在使用text 时,我们需要复制y 的每个元素nrow(H) 次:

    y <- barplot(h, col = 1 + 1:nrow(h), xaxt = "n", horiz = TRUE)
    text(H, rep(y, each = nrow(H)), labels = paste0(100 * h, "%"))
    

    【讨论】:

    • 哇,你真快。好答案!
    【解决方案2】:

    这是另一个使用mapply的解决方案:

    invisible(mapply(function(k, l) text(x = (k - l/2), y = bc, 
              labels = paste0(l*100, "%"), cex = 1.5),
              cumsum(relative.frequencies), relative.frequencies))
    

    mapplysapply 的多变量版本。在这种情况下,它需要两个输入:cumsum(relative.frequencies)relative.frequencies,并使用这两个向量应用 text() 函数。 x = 是标签的坐标,它取每个累积总和减去每个对应 relative.frequencies 的一半。然后relative.frequencies 再次用作要绘制的标签。

    invisible() 函数禁止将输出打印到控制台。

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2017-02-21
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多