r - 使用 R base : how to add values inside each stacked bar 的堆叠条形图

标签 r plot bar-chart

我在一本统计书中发现了一个情节,我想用基础包重现它。

剧情是这样的:

enter image description here

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

我的代码是这样的:

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 )

最佳答案

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

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, "%"))

strip


致所有读者

现在我将构建一个综合示例来让您消化这个想法。

第一步:生成用于实验的百分比玩具矩阵

## 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, "%"))

vertical barchart

对于水平条形图,上面的 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, "%"))

Horizontal bar-chart

关于r - 使用 R base : how to add values inside each stacked bar 的堆叠条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40919759/

相关文章:

python - Matplotlib - 散布在常规图的顶部

r - ggplot2 中随时间变化的 CumSum 与 Total 的关系

python - 结合条形图和线图的问题(python)

R 中具有不同填充的 R 堆叠分组条形图

matlab - 在纸上以精确尺寸打印 MATLAB 图

matlab - 一次绘制可变数量的向量?

r - 有没有办法在 r 中将 2 位数年份变成 4 位数年份

r - 为什么 Rshiny tableOutput 创建一个附加列?

为多个不是第一个参数的参数运行具有多个值的函数

r - 如何在函数内部使用data.table?