R - 两个连续变量的 Empiled 直方图

R - Empiled histogram for two continuous variables

我想像第一个一样制作一个累积直方图

我有两个连续的收入变量(一个是家庭的总收入,一个是家庭中一个人的收入)。

然而,即使在 Whosebug 中已经有很多问题,我还是无法制作这个直方图。

我的数据集称为 df,家庭变量是 df$household,另一个是 df$individual。

我试过这样做

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

我想我对填充的东西完全错了!

如果包含一些样本数据,您更有可能得到好的答案。在这种情况下,创建一些大致匹配数据形状的样本数据并不太难:

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)

...当然,这些不是堆叠的。这样做的原因是您有两个独立的变量,需要根据它们独立创建两个直方图。这些 "don't know" 相互之间没有任何关系,因此它们无法叠加。

那么解决方法是什么?与许多绘图问题一样,解决方案涉及准备数据,使其采用您希望呈现的 格式。您希望将所有收入显示为一个大直方图,但根据它们是个人收入还是家庭收入对部分条形图进行着色。换句话说,您需要将所有收入放在一个列中,并将 "household" 和 "individual" 作为分组列中的标签。这被称为 长格式 数据,如果您可以将数据转换为这种格式,通常会使绘图更容易。

在您的情况下,使用 tidyr 包中的 pivot_longer 非常简单:

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

reprex package (v0.3.0)

于 2020-06-19 创建