Создайте штабелированный планшет, где каждый стек масштабируется, чтобы суммировать до 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))
Любая помощь?
Ответы
Ответ 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, вы примените его к строкам). Затем анонимная функция получает каждый столбец данных по одному.