为什么堆积条形图与 table 中的值不匹配?
Why does the stacked bar chart not match values in table?
我有一个数据集,其中包含城市和这些城市中特定物品的价格(例如出租车、饮料、晚餐等)- 可以在此处找到数据集:https://data.world/makeovermonday/2018w48
我计算了派对之夜和约会之夜的总费用:
CostNightPrepared <- CostNight %>%
group_by(City, Category) %>%
mutate(TotalCost = sum(Cost, na.rm = TRUE))%>%
arrange(desc(Category), TotalCost)
绘制出来:
Visual <- ggplot(CostNightPrepared, aes(TotalCost, fct_rev(fct_reorder(City, TotalCost)), fill=Category)) +
geom_col(position = "stack") +
geom_text(aes(label = round(TotalCost, 1)), position = position_dodge(1))
它给了我以下输出:
如果您注意到,例如,最后一个城市苏黎世的“派对之夜”的值为 179,但是,该列在 x 轴上达到 800 左右 !所有其他列也是如此 - 它们与“约会之夜”和“派对之夜”的值不匹配。这里有什么问题?
如果我执行相同的代码,但对 geom_col() 使用 position = dodge,则它有效:
Visual <- ggplot(CostNightPrepared, aes(TotalCost, fct_rev(fct_reorder(City, TotalCost)), fill=Category)) +
geom_col(position = "dodge") +
geom_text(aes(label = round(TotalCost, 1)), position = position_dodge(1))
这是输出:
如您所见,这些值与其在 x 轴上的相应列大小(长度)相匹配。
那么,为什么在使用 position = "dodge" 时,我的列与数据集中的实际值不匹配,并且在 x 轴上具有任意值?
我想你想要 summarize
而不是 mutate
。通过使用 mutate
,你得到了每一行的总计 City/Category,然后将这些行中的每一行输入到 ggplot2 中。
您确实需要每个 City/Category 组合一行,这就是 summarize 产生的结果。
可重现的例子:
mtcars %>%
head() %>%
group_by(carb, gear) %>%
mutate(total_wt = sum(wt)) %>%
ungroup() -> mtcars_summary
#mtcars_summary
## A tibble: 6 x 12
# mpg cyl disp hp drat wt qsec vs am gear carb total_wt
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 5.50
#2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 5.50
#3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 2.32
#4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 6.68
#5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 3.44
#6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 6.68
请注意,上面 mutate
给出了 每行 其组的总权重。 ggplot2::geom_col 然后将堆叠它收到的所有行,导致比您想要的更长的条。 (另一个提示是文本看起来“过度绘制”——这是因为每个字符在组中的每一行都被打印一次——也就是说,你可能有十个相同文本的副本在彼此之上,导致糟糕的抗-混叠外观。)
ggplot(mtcars_summary, aes(total_wt,
carb %>% as_factor %>% fct_reorder(total_wt),
fill = as.character(gear))) +
geom_col(position = "stack") +
geom_text(aes(label = round(total_wt, 1)), position = position_dodge(1))
如果我们将 mutate
替换为 summarize
,我们会得到更多您所期望的,其中进入条形的输入不会针对原始数据中的每个元素重复:
#mtcars_summary
## A tibble: 4 x 3
# carb gear total_wt
# <dbl> <dbl> <dbl>
#1 1 3 6.68
#2 1 4 2.32
#3 2 3 3.44
#4 4 4 5.50
我有一个数据集,其中包含城市和这些城市中特定物品的价格(例如出租车、饮料、晚餐等)- 可以在此处找到数据集:https://data.world/makeovermonday/2018w48
我计算了派对之夜和约会之夜的总费用:
CostNightPrepared <- CostNight %>%
group_by(City, Category) %>%
mutate(TotalCost = sum(Cost, na.rm = TRUE))%>%
arrange(desc(Category), TotalCost)
绘制出来:
Visual <- ggplot(CostNightPrepared, aes(TotalCost, fct_rev(fct_reorder(City, TotalCost)), fill=Category)) +
geom_col(position = "stack") +
geom_text(aes(label = round(TotalCost, 1)), position = position_dodge(1))
它给了我以下输出:
如果您注意到,例如,最后一个城市苏黎世的“派对之夜”的值为 179,但是,该列在 x 轴上达到 800 左右 !所有其他列也是如此 - 它们与“约会之夜”和“派对之夜”的值不匹配。这里有什么问题?
如果我执行相同的代码,但对 geom_col() 使用 position = dodge,则它有效:
Visual <- ggplot(CostNightPrepared, aes(TotalCost, fct_rev(fct_reorder(City, TotalCost)), fill=Category)) +
geom_col(position = "dodge") +
geom_text(aes(label = round(TotalCost, 1)), position = position_dodge(1))
这是输出:
如您所见,这些值与其在 x 轴上的相应列大小(长度)相匹配。
那么,为什么在使用 position = "dodge" 时,我的列与数据集中的实际值不匹配,并且在 x 轴上具有任意值?
我想你想要 summarize
而不是 mutate
。通过使用 mutate
,你得到了每一行的总计 City/Category,然后将这些行中的每一行输入到 ggplot2 中。
您确实需要每个 City/Category 组合一行,这就是 summarize 产生的结果。
可重现的例子:
mtcars %>%
head() %>%
group_by(carb, gear) %>%
mutate(total_wt = sum(wt)) %>%
ungroup() -> mtcars_summary
#mtcars_summary
## A tibble: 6 x 12
# mpg cyl disp hp drat wt qsec vs am gear carb total_wt
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 5.50
#2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 5.50
#3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 2.32
#4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 6.68
#5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 3.44
#6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 6.68
请注意,上面 mutate
给出了 每行 其组的总权重。 ggplot2::geom_col 然后将堆叠它收到的所有行,导致比您想要的更长的条。 (另一个提示是文本看起来“过度绘制”——这是因为每个字符在组中的每一行都被打印一次——也就是说,你可能有十个相同文本的副本在彼此之上,导致糟糕的抗-混叠外观。)
ggplot(mtcars_summary, aes(total_wt,
carb %>% as_factor %>% fct_reorder(total_wt),
fill = as.character(gear))) +
geom_col(position = "stack") +
geom_text(aes(label = round(total_wt, 1)), position = position_dodge(1))
如果我们将 mutate
替换为 summarize
,我们会得到更多您所期望的,其中进入条形的输入不会针对原始数据中的每个元素重复:
#mtcars_summary
## A tibble: 4 x 3
# carb gear total_wt
# <dbl> <dbl> <dbl>
#1 1 3 6.68
#2 1 4 2.32
#3 2 3 3.44
#4 4 4 5.50