Как получить проценты в горизонтальном штабелированном барплоте [дубликат]

одно из писем моего приложения постоянно помечено как спам. это был html с единственной ссылкой, которую я отправил как html в теле с текстом типа text / html.

Мое самое успешное решение этой проблемы состояло в том, чтобы составить электронное письмо, чтобы оно выглядело так, как будто оно было сгенерировано через почтовый клиент.

я изменил электронное письмо как многопользовательский / альтернативный mime-документ, и теперь я генерирую как текстовые, так и текстовые / текстовые части.

письмо больше не является обнаружен как мусор по перспективам.

3
задан 李哲源 1 December 2016 в 22:51
поделиться

2 ответа

В данном примере мы можем сделать (все читатели могут пропустить эту часть и перейти к следующему):

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 (невидимо). Имейте в виду, что нам нужно реплицировать каждый из элементов x nrow(H) при использовании text:

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 (невидимо). Имейте в виду, что нам нужно реплицировать каждый из элементов y nrow(H) при использовании text:

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

2
ответ дан 李哲源 15 August 2018 в 20:59
поделиться

Вот еще одно решение, использующее 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))

mapply - многомерная версия sapply. В этом случае он принимает два входа: cumsum(relative.frequencies) и relative.frequencies и применяет функцию text(), используя эти два вектора. x = - координаты меток, которые берут каждую кумулятивную сумму минус половина каждого соответствующего relative.frequencies. relative.frequencies затем снова используется в качестве меток, которые должны быть построены.

Функция invisible() подавляет печать выходов в консоль.

2
ответ дан useR 15 August 2018 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: