R - построенная гистограмма для двух непрерывных переменных - PullRequest
0 голосов
/ 19 июня 2020

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

У меня есть две непрерывные переменные дохода (одна - это общий доход домохозяйств, а другая - доход одного

Однако, хотя в Stackoverflow уже есть много вопросов, я не могу составить эту гистограмму.

Мой набор данных называется df, а переменная для домохозяйство - это df $ home, а другое - df $ индивидуальное.

Я пробовал это сделать

ggplot(df, aes(group = individual, x = household, fill= individual), colour = c("red", "blue")) + geom_histogram() + xlim(0, 350000)

Я думаю, что совершенно не прав в отношении заполнения!

1 Ответ

0 голосов
/ 19 июня 2020

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

library(ggplot2)
library(dplyr)
library(tidyr)

set.seed(69)

individual <- round(rgamma(1000, 2.5, 1/11000))
household  <- round(individual + runif(1000, 0, 30000))

df <- data.frame(household, individual)

Это должно дать нам несколько разумных чисел:

head(df)
#>   household individual
#> 1     44277      23217
#> 2     55581      28208
#> 3     36186      17100
#> 4     39693      36174
#> 5     27371      16424
#> 6     16406       9615

И мы можем проверить, что их распределения также разумны:

hist(df$household)

hist(df$individual)

Теперь мы можем перейти к собственно ответу!

Одна из причин, по которой вы не получаете желаемый график, заключается в том, что ваши данные не в том же формате, что и данные iris. Две составные гистограммы в связанном вопросе - это не гистограммы двух непрерывных переменных в разных столбцах, а подмножества того же столбца , окрашенного в соответствии с видами, который находится в другом столбце.

Это конечно, можно нарисовать гистограммы для обеих ваших переменных на одном графике:

ggplot(df) + 
  geom_histogram(aes(x = household), fill = "gold") + 
  geom_histogram(aes(x = individual), fill = "tomato", alpha = 0.5)

... но, конечно, они не складываются. Причина этого в том, что у вас есть две отдельные переменные, и вам нужно независимо создать из них две гистограммы. Они «ничего не знают» друг о друге, поэтому не могут складываться.

Итак, какое решение? Как и во многих других задачах построения графиков, решение включает подготовку ваших данных, чтобы они были в формате , который вы должны sh представить . Вы можете sh представить все доходы в виде одной большой гистограммы, но с частями полосок, окрашенными в зависимости от того, являются ли они доходами отдельных лиц или семейных доходов. Другими словами, вам нужно собрать все свои доходы в один столбец, а метки «домохозяйство» и «физическое лицо» должны быть в столбце группирования. Это известно как данные длинный формат , и обычно упрощает построение графиков, если вы можете преобразовать данные в этот формат.

В вашем случае это довольно просто, используя pivot_longer из tidyr package:

df %>% pivot_longer(cols = c("household", "individual"))
#> # A tibble: 2,000 x 2
#>    name       value
#>    <chr>      <dbl>
#>  1 household  44277
#>  2 individual 23217
#>  3 household  55581
#>  4 individual 28208
#>  5 household  36186
#>  6 individual 17100
#>  7 household  39693
#>  8 individual 36174
#>  9 household  27371
#> 10 individual 16424
#> # ... with 1,990 more rows

Это делает сюжет очень простым (я добавил пару масштабов и элементов темы, чтобы сделать его более привлекательным):

df %>% 
  pivot_longer(cols = c("household", "individual")) %>%
  ggplot() + 
    geom_histogram(aes(x = value, fill = name), colour = "black") +
    scale_fill_manual(values = c("gold", "dodgerblue")) +
    scale_x_continuous(breaks = 0:12 * 10000) + 
    theme(axis.text.x = element_text(angle = 90)) +
    labs(x = "Income ($)", y = "Number", title = "Income distribution")

Создано 19.06.2020 пакетом REPEX (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...