Гистограмма с накоплением кластера

Я хочу изобразить что-то подобное в R.

введите здесь описание изображения

Я нашел похожее решение здесь, поэтому я пробовал нечто подобное:

test  <- data.frame(person=c("group 1", "group 2", "group 3"), 
                value1=c(100,150,120),  # male   
                value2=c(25,30,45) ,    # female
                value3=c(25,30,45),     # male
                value4=c(100,120,150),  # female
                value5=c(10,12,15),     # male
                value6=c(50,40,70))     # female

library(reshape2) # for melt

melted <- melt(test, "person")

melted$cat <- ''
melted[melted$variable == 'value1' | melted$variable == 'value2',]$cat <- "sub group 1"
melted[melted$variable == 'value3' | melted$variable == 'value4',]$cat <- "sub group 2"
melted[melted$variable == 'value5' | melted$variable == 'value6',]$cat <- "sub graoup 3"

p = ggplot(melted, aes(x = cat, y = value, fill = variable)) 
    + geom_bar(stat = 'identity', position = 'stack') + facet_grid(~ person)

Я закончил:

введите здесь описание изображения

Проблема в том, что теперь у меня есть 6 разных значений с 6 разными цветами. Что мне действительно нужно, так это два разных значения, давайте назовем тему male и female, представленную двумя разными цветами.

Как я могу это сделать в R? Данные могут быть созданы любым другим способом (не обязательно использовать data.frame, как указано выше). Мне не нужно использовать ggplot. На самом деле, я предпочитаю чистый белый фон в примере изображения, чем серый фон, который я получил с помощью ggplot.


person chepukha    schedule 30.10.2015    source источник


Ответы (1)


Вы можете просто добавить еще одну переменную в свой расплавленный фрейм данных, содержащий информацию о поле, а затем построить график в ggplot. Фон также можно легко изменить на белый. Я отредактировал ваш пример кода и разместил его ниже.

Надеюсь, это поможет!

test  <- data.frame(person=c("group 1", "group 2", "group 3"), 
                value1=c(100,150,120),  # male   
                value2=c(25,30,45) ,    # female
                value3=c(25,30,45),     # male
                value4=c(100,120,150),  # female
                value5=c(10,12,15),     # male
                value6=c(50,40,70))     # female

library(reshape2) # for melt

melted <- melt(test, "person")

melted$cat <- ''
melted[melted$variable == 'value1' | melted$variable == 'value2',]$cat <- "sub group 1"
melted[melted$variable == 'value3' | melted$variable == 'value4',]$cat <- "sub group 2"
melted[melted$variable == 'value5' | melted$variable == 'value6',]$cat <- "sub group 3"
melted$gender <- ''
melted[melted$variable %in% sprintf("value%i",c(1,3,5)),]$gender <- "female"
melted[melted$variable %in% sprintf("value%i",c(2,4,6)),]$gender <- "male"


p = ggplot(melted, aes(x = cat, y = value, fill = gender)) 

p + geom_bar(stat = 'identity', position = 'stack') +   facet_grid(~ person) + 
scale_fill_manual(values = c("orangered","dodgerblue2")) + 
theme(panel.background = element_rect(fill = 'white'))
person sam    schedule 30.10.2015
comment
Спасибо за ответ, @sam. Я получил ошибку Error: No layers in plot при запуске этого фрагмента. Он не указывает ни на одну строку, это очень общая ошибка. - person chepukha; 30.10.2015
comment
Я попытался добавить + geom_line() в конец, но получил ту же ошибку. Кстати, я использую print(p) для отображения графика. - person chepukha; 30.10.2015
comment
теперь он работает хорошо. Но ggplot сортирует метку c("group 1", "group 2", "group 3") и упорядочивает группы на графике в алфавитном порядке. Например. если у меня person=c('Eroupean', 'Asian', 'Ameria'), то сначала всегда отображается группа America. Могу ли я как-нибудь сказать ggplot использовать порядок как есть? Спасибо - person chepukha; 30.10.2015
comment
Привет! Рад, что это сработало. Вы можете получить желаемый порядок, упорядочив уровни соответствующих факторов перед построением графика: melted$person <- factor(melted$person,levels = c("group 2","group 1","group 3"),ordered = T) melted$cat <- factor(melted$cat,levels = c("sub group 3","sub group 1","sub group 2"),ordered = T) Надеюсь, это поможет! - person sam; 02.11.2015