Подтвердить что ты не робот

Создайте штабелированный планшет, где каждый стек масштабируется, чтобы суммировать до 100%

У меня есть data.frame вот так:

df <- read.csv(text = "ONE,TWO,THREE
                       23,234,324
                       34,534,12
                       56,324,124
                       34,234,124
                       123,534,654")

Я хочу создать график процентного бара, который выглядит так (сделанный в LibreOffice Calc): enter image description here

Таким образом, бары должны быть стандартизированы, поэтому все стеки имеют одинаковую высоту и суммы до 100%. До сих пор все, что мне удалось получить, это сложный барплот (не процент), используя:

barplot(as.matrix(df))

Любая помощь?

4b9b3361

Ответ 1

Вот решение, использующее этот пакет ggplot (версия 3.x) в дополнение к тому, что вы уже получили.

Мы используем аргумент position geom_bar установленный в position = "fill". Вы также можете использовать position = position_fill() если хотите использовать аргументы position_fill() (vjust и reverse).

Обратите внимание, что ваши данные представлены в "широком" формате, тогда как ggplot2 требует, чтобы они были в "длинном" формате. Таким образом, нам сначала нужно gather данные.

library(ggplot2)
library(dplyr)
library(tidyr)

dat <- read.table(text = "    ONE TWO THREE
1   23  234 324
2   34  534 12
3   56  324 124
4   34  234 124
5   123 534 654",sep = "",header = TRUE)

# Add an id variable for the filled regions and reshape
datm <- dat %>% 
  mutate(ind = factor(row_number()) %>% 
  gather(variable, value, -ind)

ggplot(datm, aes(x = variable, y = value, fill = ind)) + 
    geom_bar(position = "fill",stat = "identity") +
    # or:
    # geom_bar(position = position_fill(), stat = "identity") 
    scale_y_continuous(labels = scales::percent_format())

enter image description here

Ответ 2

prop.table - хороший дружественный способ получения пропорций таблиц.

m <- matrix(1:4,2)

 m
     [,1] [,2]
[1,]    1    3
[2,]    2    4

Пустое поле оставляет пустые значения для всей таблицы.

 prop.table(m, margin=NULL)
     [,1] [,2]
[1,]  0.1  0.3
[2,]  0.2  0.4

Предоставление 1 дает вам пропорции строк

 prop.table(m, 1)
      [,1]      [,2]
[1,] 0.2500000 0.7500000
[2,] 0.3333333 0.6666667

И 2 - значения столбцов

 prop.table(m, 2)
          [,1]      [,2]
[1,] 0.3333333 0.4285714
[2,] 0.6666667 0.5714286

Ответ 3

Крис Били строг, вам нужны только пропорции по столбцу. Использование ваших данных:

 your_matrix<-( 
               rbind(
                       c(23,234,324), 
                       c(34,534,12), 
                       c(56,324,124), 
                       c(34,234,124),
                       c(123,534,654)
                    )
                )

 barplot(prop.table(your_matrix, 2) )

дает:

enter image description here

Ответ 4

Вам просто нужно разделить каждый элемент на сумму значений в его столбце.

Выполнение этого должно быть достаточным:

data.perc <- apply(data, 2, function(x){x/sum(x)})

Обратите внимание, что второй параметр сообщает apply применить предоставленную функцию к столбцам (используя 1, вы примените его к строкам). Затем анонимная функция получает каждый столбец данных по одному.