2015-10-30 2 views
0

Я хочу, чтобы построить что-то подобное в R.Кластера сложен Барграф

enter image description here

Я нашел подобное решение here поэтому я пытался что-то подобное:

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) 

Что я завершившийся является:

enter image description here

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

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

ответ

0

Вы можете просто добавить другую переменную в свой расплавленный фрейм данных, содержащий гендерную информацию, а затем занести в 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')) 
+0

Спасибо за ваш ответ @sam. Я получил ошибку 'Error: No layers in plot', выполняющую этот фрагмент. Он не указывает на какую-либо строку, очень общую ошибку. – chepukha

+0

Я попытался добавить '+ geom_line()' до конца, но получить ту же ошибку. BTW, я использую 'print (p)' для отображения графика. – chepukha

+0

сейчас хорошо работает. Но ggplot сортирует метку 'c (" group 1 "," group 2 "," group 3 ")' и упорядочивает группы на графике согласно алфавитному порядку. Например. если у меня есть 'person = c ('Eroupean', 'Asian', 'Ameria')', тогда группа 'America' всегда отображается первой. Есть ли способ, которым я могу сказать «ggplot» просто использовать заказ, как есть? Спасибо – chepukha