首页 > 解决方案 > ggplot 和 geom_bar 的问题:希望两列堆叠而不加在一起

问题描述

我正在制作一个条形图,显示两次选举中获得了多少票和候选人。我希望将这些值堆叠起来,但是这些值加在一起以使 y 轴大于应有的值。因此,例如,在 x=23 点,2018 年的值应该只有 800 左右。2019 年的值是正确的,但是将两者相加使 2019 年的值大于应有的值。

在此处输入图像描述

我不明白如何获得它,以便它向我显示 2018 年的值,其中 2019 年的值堆叠在其中,而不将两者相加。

这是我正在使用的代码:

ggplot(data = OverallMcCreadyVotes, aes(x=precinct_abbrv, y=McCready,fill=year)) +
  geom_bar(stat = "identity") +
  scale_fill_manual(
    breaks = c("2019","2018"),
    values = c("dark blue","light blue")
  )

标签: rggplot2geom-bar

解决方案


如果我理解得很好,你想要stacked bar但不增加 2018 年到 2019 年的值。

一个可能的技巧(也许存在其他技巧,这是我想到的第一个技巧)是从 2019 年开始操纵你的价值观,让它们成为 2019 年和 2018 年之间的差异。就像那样,一旦你的价值观是绘制,因为stack您将没有值的总和,而是 2019 年的实际值。

让我用这个例子解释一下(它来自mtcars我稍微扭曲以使其更漂亮的数据集):

library(tidyverse)
d = mtcars[1:20,]
d <- d %>% group_by(cyl, gear) %>% summarize(M = mean(disp))
d[5,] <- c(8,4,150)
d[6,] <- c(4,3,240)
> d
# A tibble: 6 x 3
# Groups:   cyl [3]
    cyl  gear     M
* <dbl> <dbl> <dbl>
1     4     4  104.
2     6     3  242.
3     6     4  164.
4     8     3  365.
5     8     4  150 
6     4     3  240 

如果我们像您对代码所做的那样进行绘图,我们将得到:

library(ggplot2)
ggplot(d, aes(x = cyl, y = M, fill = as.factor(gear)))+
  geom_bar(stat = "identity")

在此处输入图像描述

我们最终可以使用position_dodge(0)一些透明度,但颜色不是很好:

ggplot(d, aes(x = cyl, y = M, fill = as.factor(gear)))+
  geom_bar(stat = "identity", position = position_dodge(0), alpha = 0.4)

在此处输入图像描述

所以,正如我提到的,我们最终可以从 操纵值gear = 3,使它们成为gear 3 = gear3- gear4,我们可以使用tidyrand来做到这一点dplyr。(很可能有更简单的方法来实现这个结果,但这是我首先想到的,它只是向您展示我们应该获得什么的想法)

library(tidyverse)
d %>% group_by(cyl) %>% pivot_wider(names_from = "gear", values_from = "M") %>%
  mutate(Gear4 = `4`, Gear3 = `3`) %>% mutate(Gear3 = Gear3 - Gear4) %>% select(cyl, Gear4, Gear3) %>%
  pivot_longer(., -cyl, names_to = 'Gear', values_to = "Mean") 

# A tibble: 6 x 3
# Groups:   cyl [3]
    cyl Gear   Mean
  <dbl> <chr> <dbl>
1     4 Gear4 104. 
2     4 Gear3 136. 
3     6 Gear4 164. 
4     6 Gear3  77.7
5     8 Gear4 150  
6     8 Gear3 215. 

现在,如果你正在绘制它们,你会得到:

ggplot(d, aes(x = as.factor(cyl), y = Mean, fill = Gear)) +
  geom_bar(stat = "identity")

在此处输入图像描述

你会得到一个堆叠的条形图,其中没有 和 的值gear = 3总和gear = 4

但是,只有当您的所有值 fromGear 3都优于来自的值时,此示例才有效Gear 4。否则,你会有一些奇怪的条形图。

对于您的示例,我的个人意见是将其表示为geom_line

ggplot(d, aes(x = cyl,  y = M, color = as.factor(gear))) + geom_line() + geom_point()

在此处输入图像描述

它回答了你的问题吗?


推荐阅读