2012-06-14 2 views
12

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

У меня есть dataframe, который выглядит примерно так:

cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low") 
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young") 
df <- as.data.frame(cbind(cat1, cat2)) 

В примере здесь, я хочу, чтобы построить пропорцию каждой возрастной группы, которые имеют значение «высокое», а доля каждой возрастной группы, которые имеют значение «низкий». В общем, я хочу построить, за каждое значение категории 2, процент наблюдений, попадающих в каждый из уровней категории 1.

Следующий код дает правильный результат, но только путем ручного подсчета и деление перед построением графика. Есть ли хороший способ сделать это на лету внутри ggplot?

library(plyr) 
count1 <- count(df, vars=c("cat1", "cat2")) 
count2 <- count(df, "cat2") 

count1$totals <- count2$freq 
count1$pct <- count1$freq/count1$totals 

ggplot(data = count1, aes(x=cat2, y=pct))+ 
facet_wrap(~cat1)+ 
geom_bar() 

This previous stackoverflow question предлагает что-то подобное, со следующим кодом:

ggplot(mydataf, aes(x = foo)) + 
geom_bar(aes(y = (..count..)/sum(..count..))) 

Но я не хочу «сумма (.. подсчет ..)» - которая дает сумму подсчета всех Ящики - в знаменателе; скорее, я хочу получить сумму подсчета каждой из категорий «cat2». Я также изучил документацию stat_bin.

Я был бы признателен за любые рекомендации и предложения по поводу того, как это сделать.

+1

В дополнение к моему ответу, я также укажу вам на [это] (http://stackoverflow.com/a/10888762/324364) ответ, который может быть полезен. (Но имейте в виду, что такие взломы могут не сохраниться, поскольку ggplot будет обновляться до последующих версий.) – joran

+0

Поскольку это не типичное резюме данных, в ggplot нет простого синтаксиса. Ваш лучший подход заключается в предварительном обобщении данных, как вы это делали. –

ответ

33

Я пойму, если это не совсем то, что вы ищете, но я нашел ваше описание того, что вы хотели очень сбивать с толку, пока я не понял, что вы просто пытаетесь визуализировать свои данные таким образом, который казался очень неестественным мне.

Если кто-то спросил меня, чтобы произвести граф пропорций внутри каждой категории, я бы, наверное, обратиться к сегментной гистограммой:

ggplot(df,aes(x = cat2,fill = cat1)) + 
    geom_bar(position = "fill") 

enter image description here

Обратите внимание на записи у оси пропорции, не считается, как вы хотели.

+0

спасибо, это отличное решение.Спасибо, что предоставил мне отличную альтернативу тому, что я пытался сделать. – user1257313

+0

Спасибо, это очень хороший, но также очень простой ответ, который должен помочь многим людям, которые сбивают с толку и оскорбляют вещи (как я сейчас). –

+0

cat1 должен быть фактор-переменной, не работает, если непрерывный/числовой –

4

Это может быть немного поздно для вас, и это не включая ggplot, НО:

Я думаю mosaicplots путь вперед, чтобы визуализировать взаимодействие двух факторов:

cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low") 
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young") 
df <- as.data.frame(cbind(cat1, cat2)) 

mosaicplot(cat2 ~ cat1, data = df, col = c(lightskyblue2', 'tomato')) 

mosaic plot of data with two factors

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

Смежные вопросы