Как сделать гистограмму плотности разделенной на второе значение в ggplot2?

У меня проблема с гистограммой плотности в 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 и той же категории занятий, и то же самое для всех других типов занятий

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

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

Jan Boyer 11.01.2019 19:05

Повторное использование гистограммы. Гистограмма отображает плотность или частоту, и в этом случае вы сравниваете два интервала: <= 50K и> 50K. geom_bar() может быть здесь лучшим вариантом.

OTStats 11.01.2019 19:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
403
1

Ответы 1

Это ситуация, когда имеет смысл сначала повторно агрегировать ваши данные, прежде чем строить график. Агрегирование в вызове 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')

потрясающе, спасибо! Не могли бы вы помочь мне со второй частью вопроса (как теперь отсортировать эти столбцы в порядке убывания, отдельно для> 50K и <= 50K)?

Ra-v 15.01.2019 14:12

@ Ra-v, который относится к новому вопросу, и есть некоторые существующие вопросы, которые уже касаются сортировки уклонившихся столбцов.

Mako212 15.01.2019 18:23

Другие вопросы по теме