2016-05-03 2 views
-1

Как бы построить гистограмму, показывающую процент в пределах пола для каждого из различных уровней varggplot плавления и построение гистограммы

Данные могут быть построены следующим образом:

structure(list(var = structure(c(5L, 5L, 5L, 6L, 5L, 4L, 5L, 
6L, 6L, 6L, 5L, 5L, 5L, 6L, 6L, 5L, 6L, 5L, 6L, 5L), .Label = c("-97:\nMultiple\nResponse", 
"-99:\nRefused", "1:\nDefinitely", "2:\nProbably", "3:\nProbably\nnot", 
"4:\nDefinitely\nnot"), class = "factor"), GENDER = structure(c(1L, 
2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 
1L, 2L, 1L), .Label = c("1: Male", "2: Female", "3: Unknown"), class = "factor")), .Names = c("var", 
"GENDER"), row.names = c(NA, 20L), class = "data.frame") 

I хотите, чтобы бары в пределах gender на каждый уровень составляли до 100%

ответ

1

Подведите данные, чтобы получить проценты от GENDER на каждом уровне var. Ниже я использую dplyr, чтобы сделать это на лету в рамках вызова ggplot. Я назвал ваши данные кадра dat:

library(dplyr) 
library(scales) 

ggplot(dat %>% group_by(var, GENDER) %>% 
     tally %>% 
     mutate(pct=n/sum(n)), aes(var, pct, fill=GENDER)) + 
    geom_bar(stat="identity") + 
    scale_y_continuous(labels=percent_format()) 

enter image description here

UPDATE: Чтобы пустые категории включены:

ggplot(dat %>% group_by(var, GENDER) %>% 
     tally %>% 
     mutate(pct=n/sum(n))) + 
    geom_bar(stat="identity", aes(var, pct, fill=GENDER)) + 
    scale_y_continuous(labels=percent_format()) + 
    scale_x_discrete(drop=FALSE) 
+0

Это не работает достаточно хорошо. Первый уровень отсутствует, и каждая из категорий ответов добавляет до 100%. – vashts85

+0

Некоторые из уровней отсутствуют, потому что они отсутствуют в образце предоставленных данных. Что касается баров, суммирующих до 100%, казалось, ваш вопрос требовал, чтобы бары составляли 100% для каждого значения var. Если я неверно истолковал, объясните, как вы хотите группировать данные. – eipi10

+0

На самом деле ваш рабочий процесс работает очень хорошо, мне просто нужна была минута. Как бы немного изменить порядок, чтобы отображались все значения 'var'? Вот то, что я пытался, но не включает некоторые из значений 'var', которые не присутствуют: ggplot (Дат%>% group_by (РОД, вар)%>% Tally%>% мутировать (pct = n/sum (n)), aes (GENDER, pct, fill = var)) + geom_bar (stat = "identity", position = "dodge") + scale_y_continuous (labels = percent_format()) + scale_x_discrete (падение = FALSE) – vashts85