Подтвердить что ты не робот

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()

qaru.site/info/48659/... предлагает нечто похожее со следующим кодом:

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

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

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

4b9b3361

Ответ 1

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

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

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

enter image description here

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

Ответ 2

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

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

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'))

мозаичный график данных с двумя факторами

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