Как сделать так, чтобы гистограмма плотности была разделена на второе значение в ggplot2? - PullRequest
0 голосов
/ 11 января 2019

У меня проблема с гистограммой плотности в ggplot2. Я работаю в RStudio и пытаюсь создать гистограмму плотности дохода, зависящей от профессии людей. Моя проблема в том, что когда я использую свой код:

data = read.table("http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data",
        sep=",",header=F,col.names=c("age", "type_employer", "fnlwgt", "education", 
                "education_num","marital", "occupation", "relationship", "race","sex",
                "capital_gain", "capital_loss", "hr_per_week","country", "income"),
        fill=FALSE,strip.white=T)

ggplot(data=dat, aes(x=income)) + 
  geom_histogram(stat='count', 
                 aes(x= income, y=stat(count)/sum(stat(count)), 
                     col=occupation, fill=occupation),
                 position='dodge')

В ответ я получаю гистограмму каждого значения, деленную на общее количество всех значений всех категорий, и мне хотелось бы, например, для людей, зарабатывающих> 50 тыс., Которые занимаются «ремонтом ремесел», деленное на общее число людей, занимающихся ремеслом. -ремонт и то же самое для <= 50K и той же категории занятий, и то же самое для любого другого типа занятия </p>

И второй вопрос, после выполнения гистограммы плотности пропппера, как я могу отсортировать столбцы в порядке убывания?

1 Ответ

0 голосов
/ 11 января 2019

Это ситуация, когда имеет смысл сначала повторно агрегировать ваши данные, прежде чем составлять график. Агрегирование в вызове ggplot прекрасно работает для простых агрегаций, но когда вам нужно агрегировать, а затем отделить группу для второго вычисления, это не так хорошо работает. Также обратите внимание, что, поскольку ваша ось x является дискретной, мы не будем использовать здесь гистограмму, вместо этого мы будем использовать geom_bar()

Сначала мы агрегируем по количеству, а затем вычисляем процент от общего числа, используя occupation в качестве группы.

d2 <- data %>% group_by(income, occupation) %>% 
  summarize(count= n()) %>% 
  group_by(occupation) %>% 
  mutate(percent = count/sum(count))

Затем просто построите гистограмму, используя geom_bar и position = 'dodge', чтобы столбцы располагались рядом, а не в стопке.

 d2 %>% ggplot(aes(income, percent, fill = occupation)) + 
   geom_bar(stat = 'identity', position='dodge')

enter image description here

...