如果您包含一些示例数据,您更有可能得到一个好的答案。在这种情况下,创建一些与您的数据形状大致匹配的示例数据并不难:
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)
...当然,这些不是堆叠的。这样做的原因是您有两个单独的变量,并且需要从它们独立地创建两个直方图。这些对彼此“一无所知”,因此无法叠加。
那么解决方法是什么?与许多绘图问题一样,解决方案包括准备您的数据,使其采用您希望呈现的格式。您希望将所有收入显示为单个大直方图,但根据它们是个人收入还是家庭收入,部分条形会被着色。换句话说,您需要将所有收入放在一个列中,并将“家庭”和“个人”作为分组列中的标签。这被称为 长格式 数据,如果您可以将数据转换为这种格式,通常会使绘图更容易。
在您的情况下,使用 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 年 6 月 19 日创建