Создайте составной барплот, где каждый стек масштабируется до 100% - PullRequest
56 голосов
/ 05 марта 2012

У меня есть 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))

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

Ответы [ 4 ]

97 голосов
/ 05 марта 2012

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

14 голосов
/ 05 октября 2012

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

 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

13 голосов
/ 05 марта 2012

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, вы получите 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
4 голосов
/ 05 марта 2012

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

Этого должно быть достаточно:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...