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 创建
我想像第一个一样制作一个累积直方图
我有两个连续的收入变量(一个是家庭的总收入,一个是家庭中一个人的收入)。
然而,即使在 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 创建